数组指针和指针数组
这两天多次被人问起涉及这方面的问题,自己一直都不太懂,也没有好好回答,现在给自己扫下盲。//以下内容大多数为转载,参杂少数个人看法,如若不妥请告知。
数组指针(行指针)
定义 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?)