昨天写一个程序的时候直接将二级指针指向二维数组,发生段错误,发现了自己的一个认识误区。

1
2
3
4
int a[5][4];
int **p;
p = a;
printf("%d", p[2][0]);   //访问引起段错误

二级指针

二级指针是一个指向指针的指针,它存储一个地址,这个地址的位置存储着另一个地址,此另一个地址指向的才是目标地址。示意图如下:

二级指针示意图

二维数组

二维数组就是两个层级的数组,他的变量名和一维数组一样就是其存储空间的起始地址。但是我异想天开的以为二维数组的变量名是二级指针,其实不然。int a[m][n] 中,a所指向的仅仅是m*n个int空间的起始地址而已,是一个一级指针。

1
2
3
4
int a[5][4];
int *p;
p = a;
printf("%d",p[2*4 + 0]); //这种访问可以

数组指针

数组指针也称为指向一维数组的指针,亦称为行指针。

int (*p)[4] 变量p即是一个数组指针,它可以指向一个宽度为4的二维数组。用法如下:

1
2
3
4
int a[5][4];
int (*p)[4];
p = a;
printf("%d", p[2][0]);     //这样就没问题了

指针数组

数组指针就是一个内容是指针的数组。int *p[4] 定义的就是含四个指针的数组。

参考资料

  1. 数组指针与指针数组的区别