一个函数形如:void f(float **p){/* 想要在函数体中按二维数组的方式访问*/ p[1][1] = 0;//c++用vc编译ok,运行出错(非法访问),我记得C语言中是可以的,不知道为什么, 怎么才能实现我这种访问方式,谢谢。} 回复内容【yuhongwei】:p申请了空间吗?【Microsoft777】:void f(float (*p)[]){}【theendname】:估计是你的p 没有申请空间【blackmurder】:如果传入的指针空间不够,当然要出错【goodluckyxl】:外部定义float X[][]和 float**访问过程是不一样的X将会直接和一个符号关联全局的话实际也对应一个地址局部分配也是一个地址 然后按照这个地址依次往下拍放二维按行展开顺序放下X[0][0] ... X[0][i]...X[m][0]...X[m][i]访问实际只是通过一个ptr一维操作访问了而当作指针传入两维那不一样,指针和数组的差别集中体现在访问过程是不同的指针是需要两次解应用得到最终数据,其实第一次解应用时已经得到正确数据第二次多余如果使用float**申请地址,那就可以正确访问了,内存访问布局一样了【goodluckyxl】:明白了没有 为什么使用数组自然是其快速的访问 编译器会通过一系列特性加快访问速度比指针显然减少很多工作步骤【wengch】:void func(float* p[10])【xxyyboy】:int F(float(*p)[2]){ p[1][1]=0x99; return 0;}int main (){ float (*b)[2] = new float[2][2]; F(b); return 0;}【xxyyboy】:float ** p 和 float(*p)[] 做为参数时是不同的。float **b = new float[2][2]; 也是不可以的【jxlczjp77】:float **p; //其实这里的p并不是一个二位数组的指针,只不过是一个指向指针的指针像你这样访问肯定是会出问题的。例如:float a[2][2]={0,1,2,3};float **p=(float**)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),均引用了非法内存所以说,二位数组并不能简单的转换成指向指针的指针。正确的指向二维数组的指针应该是:float a[5][10];float (*p)[10];//只需要定义为指向第二维的指针,忽略第一维p=a;p[0][1]=a[0][1];【zengmengliang】:空间肯定是没有问题的,申请到了,而且大小也没有问题听了大家的讲解,有点明白了,看来对指针的理解还是不够,谢谢大家