关于二维数组和指向指针的指针

来源:互联网 发布:微信商城分销源码下载 编辑:程序博客网 时间:2024/06/11 12:36

以前一直有种误解:

二维数组的是数组的数组,所以数组的首地址是指向第一个元素指针,而这个元素又是一个数组,所以把数组首地址理解为指向指针的指针。

如int a[3][2];,以前一直认为a是一个指向int指针的指针,即是一个int**。最近发现这是错的。

如果int **p=a; 编译就会报错。如果强制转换int **p=(int **)a,则使用p[i][j]访问数组元素时出错。

首先,因为a的定义为 int a[3][2];则a的类型是int* [3][2]数组类型,或者int* [][2],即指向大小为2的数组的指针,类型与int **不同,所以int **p=a;出错。

其次,考虑p[i][j]访问a的数组元素时出错的问题。当我们使用指向二维数组的指针的下标运算来访问数组元素时,如a[i][j],它等同于*(a+i*2+j);即必须要知道第二维的大小才能访问。考虑我使用p[i][j]的后果:p是int**,所以p[i]为*(p+i),而这个结果被视作一个指针,在这里记做pp=*(p+i),所以p[i][j]等同于pp[j]。最终的结果为*(pp+j),并将这个结果解释为一个int值。

 

例如:

 上面最后一部分pA[i][j]出错的原因如下:

如上所述:p[i]是*(p+i),即在p处移动i个类型单位大小(p的类型是int**,通常指针都是32位值吧……多数情况正好和int大小相同),所以正好移动i个int大小,假设i=0,j=1,则p[i]是0;那么p[i][j]就是0[1],相当于将地址4的值取出来解释为为int ,地址4当然不允许用户程序访问,所以运行时错误……

原创粉丝点击