二维数组和二级指针

4887阅读 0评论2012-03-01 
分类:LINUX

Fun (int **p){}这里面的int **p //这里的p不是二维数组的指针,而是指向指针的指针,即二级指针。

正确的二维数组的指针应该是:int a[2][2];int (*p)[2];//定义时无论数组维数,只可忽略第一维

例如:int a[2][2] = {{0,1},{2,3}};

int **p = (int**)a;//强制将二维数组指针转为指向指针的指针

则此时p[0] = 0; p[1] = 1; p[2] = 2; p[3] = 3;

而p[0][0] = *(*(p+0)+0) = **p;

p[0][1] = *(*(p+0)+1);

对于p[0][0]:由于*p = 0; ====> **p = *(0);引用地址为零的内存,必然是错误的。

对于p[0][1] = *(*p+1)====>*(4),引用了非法内存同样,

对于p[1][0] = *(1),p[1][1] = *(5),均引用了非法内存所以说,二位数组并不能简单的转换成指向指针的指针。

二维数组其实只是一个指针,而二级指针是指向指针的指针,所以二者并不等价。如上例所示:int a[2][2];

a是指向整个数组的首地址,并不是int **;所以不要指望向函数fun里面传实参 p=a;
上一篇:Vim配置编译运行C/C++程序
下一篇:const便捷记忆法