指针的应用

Posted lemongirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针的应用相关的知识,希望对你有一定的参考价值。

一.数组与指针

 1.指针数组(存放指针的数组

  例如:char *p[10]; float *p[10];int * q[4][3];

  ? 一个数组,及其元素均为指针类型的数据——指针数组

   一维指针数组:类型名 数组名[数组长度];

   二维指针数组:类型名 数组名[行][列];

   ? 一维数值指针数组:

     int array[8]  = {1,2,3,4,5,6,7,8};

     int *p[6] = {&array[0],&array[1],&array[2],&array[3]};

     p[4] = &array[4];

     p[5] = &array[5];

   ? 二维数值指针数组:

     int *a[2][3];

     a[0][1] = &array[0];

   ? 指针数组与字符串的联系:

     char *name[2] = {"hello","world"};

     name[0] = "hello";

     name[1] = "world";

    数组中存放的是字符串的首地址,而不是字符串。

//指针数组
#include <stdio.h>

int main(int argc,char *argv[])
{
    char *name[] = {"Follow me","BASIC","Grate Wall"};
    int i;
    for(i = 0;i < 3;i++)
    {
        printf("%s",name[i]);
    }
    return 0;
}

 2.数组元素指针(指向数组元素的指针)

  ? 数组元素在内存中分配的地址——数组元素的指针

   ? 定义一个指向数组元素的指针

     int a_1[10];

     int a_2[5][5];

     int *p,*q;

     p = &a_1[0];  //一维数组元素的指针

     q = &a_2[1][1];  //二维数组元素的指针

   ? 在C语言中,设定一维数组名代表了数组第一个元素的地址。

     int array[5];

     int *p;

     p = array[0];  等价于  p = array;

   ? 引用数组元素

    1.下标法:array[1];

    2.指针法:*(p + i);或*(array+i);

     ? array为数组的首地址是一个常量,不能进行array++或++array操作。

     ? p是变量,其值为array数组的首地址,可以进行++操作。

//采用指针法引用数组元素
#include <stdio.h>
int main(int argc,char *argv[])
{
    int a[5],i,*pa,*pb;
    pa = a;    //数组名代表数组首地址
    pb = &a[0];    //数组的第一个元素的地址也代表数组首地址
    for(i = 0;i < 5;i++)
    {
        a[i] = i;
        printf("a[%d] = %d\n",i,a[i]);    //0 1 2 3 4
        printf("a[%d] = %d\n",i,*(a+i));    //0 1 2 3 4
        printf("a[%d] = %d\n",i,*(pa+i));    //0 1 2 3 4
        printf("a[%d] = %d\n",i,*pb++);    //0 1 2 3 4
    }
    //printf("a[%d] = %d\n",i,a++);    //a为常量,不能进行++操作
    return 0; 
}

  3.数组指针(行指针)(指向数组的指针)

  ? 数组元素在内存中的起始地址——数组元素的指针

   ? 定义一个数组元素的指针

     int a[10]  = {1,2,3,4};

     int *p = a;  //p为数组元素的指针

   ? 数组在内存中的起始地址称为数组的指针

     int a[10] = {1,2,3,4};

     int (*q)[10]  = &a;  //q为指向数组的指针

     a为一维数组名,代表数组第一个元素的指针。

     &a:对a取地址,代表将整个数组当做一个整体,将这个地址付给q——数组指针。

//数组指针
#include <stdio.h>

int main(int argc,char *argv[])
{
    int a[5] = {1,2,3,4,5};
    int (*p)[5]  = &a;    //定义一个一维数组,指向一个一维数组
    printf("%d\n",*((int *)(p+1)-1));    //5,p+1移动整个数组的长度
    return 0;
}

   ? 指向二维数组的数组指针

     int a[3][4] = {{1,3,2,4},{5,6,7,34},{5,9,6,8}};

     int (*p)[4] = a;

     p等价于指向二维数组第0行,可完全替代a的作用。

   ? 二维数组名

     ? 二维数组名是一个二级指针

     ? a代表了二维数组第0行的行地址

     ? a+1代表了第一行的行地址

     ? *(a+1)代表了第1行第0列元素的地址

     ? *(a+1)+2代表了第1行第2列元素的地址

     ? *(*(a+1)+2)代表了第1行第2列元素

   ? 多维数组与指针

表示形式 含义
a 数组名,指向一维数组a[0],即0行首地址
a+1、&a[1] 1行首地址
*(a+0)、*a、a[0] 0行0列元素地址
*(a+1)、(*(a+1)+0)、a[1] 1行0列元素a[1][0]的地址
*(a+1)+2、a[1]+2、&a[1][2] 1行2列元素a[1][2]的地址
*(a[1]+2)、*(*(a+1)+2)、a[1][2] 1行2列元素a[1][2]的值
//数组指针
#include <stdio.h>
int main(int argc,char *argv[])
{
    int a[3][5]={
                  {1,2,3,4,5},
                  {6,7,8,9},
                  {14,12,23,66}
                };
    int i,j;
    int (*p)[5] = a;    //定义一个数组指针指向一个二维数组
    for(i = 0;i < 5;i++)    //采用数组指针打印二维数组的第一行
        printf("%d\n",*(p[0]+i));
    for(i = 0;i < 5;i++)    //采用数组指针打印二维数组的第二行
        printf("%d\n",*(p[1]+i));
    for(i = 0;i < 3;i++)    //采用数组指针打印二维数组的全部内容
    {
        for(j=0;j<5;j++)
        {    
            printf("%d\t",*(p[i]+j));
            if(j == 4)
                printf("\n");
        }
    }
    return 0;
}

二.函数与指针

 1.指针作函数参数

 

 2.指针作函数返回值

 

 3.指向函数的指针

 

以上是关于指针的应用的主要内容,如果未能解决你的问题,请参考以下文章

空指针异常 - 片段活动

使用回收器适配器获取空指针

访问片段的子视图时出现空指针异常

在使用ViewPager时尝试从其父活动修改片段时出现空指针异常

更新:C++ 指针片段

导航抽屉中的谷歌地图 - 空指针异常,哪个是正确的片段?