让一维指针指向二维数组空间的方法!
2009-12-04 13:41
399 查看
背景:int *p;int a[10][10];如何让一维指针p指向a[10][10]开辟的内存空间?
正确的方法:
1.开始我用的笨方法是另外开辟一个内存空间int*p=new int [100];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
*p=a[i][j];
p++;
}
}
p=p-100;
这样就另外开辟了100的内存空间,并让p指向了,这个内存区间的起始地址
2.直接p=&a[0][0];
3.p=a[0];这样也行,确实让人费解
4.p=(int*)a;
错误的方法:
p=a;//二维数组的数组名,表示一个指向列值个元素的一维数组的指针变量
拓展方法:
从上面可以看出,这些指针本质上都是指向一种类型(整型的指针),他们之间的转换无非是强制转换,这样都不会有问题,结论就是同类型指针同维数指针之间强制转换都不会有问题,
下面的方法:
int(*pa)[10]=null;
int **pab=(int**)pa;//这里编译没问题,运行有问题
int *p=(int*)pa;//这样编译没问题,运行也没问题,相当于二维转一维
p=(int *)pab;//编译没问题,运行没问题,二维转一维
从上面可以看出,二维指针之间强制转换会出现不可知的问题,而二维强制转一维都不会有问题!
正确的方法:
1.开始我用的笨方法是另外开辟一个内存空间int*p=new int [100];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
*p=a[i][j];
p++;
}
}
p=p-100;
这样就另外开辟了100的内存空间,并让p指向了,这个内存区间的起始地址
2.直接p=&a[0][0];
3.p=a[0];这样也行,确实让人费解
4.p=(int*)a;
错误的方法:
p=a;//二维数组的数组名,表示一个指向列值个元素的一维数组的指针变量
拓展方法:
从上面可以看出,这些指针本质上都是指向一种类型(整型的指针),他们之间的转换无非是强制转换,这样都不会有问题,结论就是同类型指针同维数指针之间强制转换都不会有问题,
下面的方法:
int(*pa)[10]=null;
int **pab=(int**)pa;//这里编译没问题,运行有问题
int *p=(int*)pa;//这样编译没问题,运行也没问题,相当于二维转一维
p=(int *)pab;//编译没问题,运行没问题,二维转一维
从上面可以看出,二维指针之间强制转换会出现不可知的问题,而二维强制转一维都不会有问题!
相关文章推荐
- 一维指针和二维指针指向二维数组的一些问题
- 定义一个一维指针指向二维数组并打印
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- 指向一维数组的指针变量和指向二维数组的指针变量---注意其指针表示
- 每日一C,指向一维、二维数组的指针及数组作为函数形参的思考(二)
- [指针二]指向一维数组、二维数组的指针使用
- // 用指向指针的指针变量访问一维和二维数组
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- c++中创建一个指针指向一个一维数组、二维数组的方法
- 指向vector的指针及空间释放问题 http://bbs.csdn.net/topics/320050082
- php实现搜索一维数组元素并删除二维数组对应元素的方法
- 二维指针、二维数组、指向数组的指针 函数参数传递
- C# 调用C++DLL传递指向指针的指针参数的方法
- 函数调用时,一维和二维数组的传值方法
- 在64位系统下,指向int型的指针占的内存空间多大?
- 二维数组做函数参数,如何将三维数组降为二维数组,指向数组的指针的使用
- 指针的相关运算,包括一维数组、二维数组、字符数组的sizeof、strlen运算
- 指向一维数组元素的指针
- 二维数组与指向指针的指针
- 获取数组和指针指向空间大小