背景: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;//编译没问题,运行没问题,二维转一维
从上面可以看出,二维指针之间强制转换会出现不可知的问题,而二维强制转一维都不会有问题!