首页 > 代码库 > 数组指针和指针数组

数组指针和指针数组

这两天多次被人问起涉及这方面的问题,自己一直都不太懂,也没有好好回答,现在给自己扫下盲。//以下内容大多数为转载,参杂少数个人看法,如若不妥请告知。

数组指针(行指针)

定义 int (*p)[n];

()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。

如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。

      //个人理解类似数据结构中的桶结构 4作为所带元素个数
 p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
 p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]

比如要表示数组中i行j列一个元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]。

所以与其叫数组指针不如叫行指针更为贴切。

这样写是会报错的:

1   int a[2][3]={{1,2,3},{4,5,6}};2   int (*p)[3];3   p=a;4   for(int i=0;i<3;i++)5       cout<<(*p)++<<endl;

这样写会输出地址:

1     int a[2][3]={{1,2,3},{4,5,6}};2     int (*p)[3];3     p=a;4     for(int i=0;i<3;i++)5         cout<<*p++<<endl;

用途:

指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。

 

指针数组

定义 int *p[n];

n个int类型的指针元素组成的数组。

 

    int a=1,b=2,c=3;
    int *p[3]={&a,&b,&c};

输出:

此时的p为指向数组指针的指针,所以和p[0]的值不同。

在写到p[5]的时候崩溃了(why?)

 

数组指针和指针数组