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;
阅读(4844) | 评论(0) | 转发(1) |