有关二级指针与二维数组的操作问题(网摘)

来源:互联网 发布:mac rm 删除文件夹 编辑:程序博客网 时间:2024/05/07 22:25
一个函数形如:
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】:
空间肯定是没有问题的,申请到了,而且大小也没有问题
听了大家的讲解,有点明白了,看来对指针的理解还是不够,谢谢大家
原创粉丝点击