首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个简单的二维指针有关问题,多谢

2012-02-17 
一个简单的二维指针问题,谢谢!一个函数形如:voidf(float**p){/*想要在函数体中按二维数组的方式访问*/p[1]

一个简单的二维指针问题,谢谢!
一个函数形如:
void   f(float   **p)
{
/*   想要在函数体中按二维数组的方式访问*/
        p[1][1]   =   0;//c++用vc编译ok,运行出错(非法访问),我记得C语言中是可以的,不知道为什么,   怎么才能实现我这种访问方式,谢谢。
}

[解决办法]
void f(float (*p)[])
{

}

[解决办法]
外部定义float X[][]和 float**访问过程是不一样的
X将会直接和一个符号关联全局的话实际也对应一个地址
局部分配也是一个地址
然后按照这个地址依次往下拍放
二维按行展开顺序放下X[0][0] ... X[0][i]...X[m][0]...X[m][i]
访问实际只是通过一个ptr一维操作访问了

而当作指针传入两维那不一样,指针和数组的差别集中体现在访问过程是不同的
指针是需要两次解应用得到最终数据,其实第一次解应用时已经得到正确数据
第二次多余

如果使用float**申请地址,那就可以正确访问了,内存访问布局一样了
[解决办法]
void func(float* p[10])
[解决办法]
int F(float(*p)[2])
{
p[1][1]=0x99;
return 0;
}

int main ()
{
float (*b)[2] = new float[2][2];
F(b);
return 0;
}
[解决办法]
float ** p 和 float(*p)[] 做为参数时是不同的。

float **b = new float[2][2]; 也是不可以的
[解决办法]
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];

热点排行