有关二级指针与二维数组的操作问题(网摘)
来源:互联网 发布: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】:
空间肯定是没有问题的,申请到了,而且大小也没有问题
听了大家的讲解,有点明白了,看来对指针的理解还是不够,谢谢大家
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】:
空间肯定是没有问题的,申请到了,而且大小也没有问题
听了大家的讲解,有点明白了,看来对指针的理解还是不够,谢谢大家
- 有关二级指针与二维数组的操作问题(网摘)
- 二级指针与二维数组
- 二维数组与二级指针
- 二维数组与二级指针
- 二维数组与二级指针
- 二级指针与二维数组
- 二维数组与二级指针
- 二维数组与二级指针
- 二级指针与二维数组
- 二级指针与二维数组
- 二维数组与二级指针
- 二级指针与二维数组
- 二维数组和二级指针的传递问题
- 二维数组和二级指针的传递问题
- 二维数组和二级指针的传递问题
- 二维数组和二级指针的传递问题
- C++:二维数组和二级指针的传递问题
- 解析二级指针与二维数组之间的关系
- 最后的告白
- 一个简单的js特效,点击放大图片
- cnBeta.COM_Linux_ Damn Small Linux v4.3 Final - U盘上的Linux
- QQ菜单
- [转]树立自信的六种方法
- 有关二级指针与二维数组的操作问题(网摘)
- MySQL 命令大全 - 命令详解
- Java泛型编程快速入门
- 正则表达式2
- 升级测试
- 长期吃方便面不好
- 惠普面试
- Enterprise Library2.0(1):Data Access Application Block学习
- Enterprise Library2.0(2):Logging Application Block学习