前两天写个程序,传参数的时候想传个二维数组进去,结果悲剧了,函数写成fun (int **p){},原来没有这么写过,
以为这么写也是对的,结果错了,查了些资料,做个总结。
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; //这里也是碰巧了, 指针和int都是4字节,恰巧每次移动到了对应值得位置;如果换成别的类型,或者64位设备就不会这么巧了;
而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;
#include <iostream>
void fun(char ** p)
{
char (*p1)[10] = (char(*)[10])p;
std::cout<<p1[0][0]<<std::endl;
}
int main(int argc, char* argv[])
{
char data[][10] = {"abc","def"};
fun((char **)data);
return 0;
}