大家从内存分配角度讨论下为什么不能将二维数组直接赋给二级指针??
我定义以下一个二维数组和一个二级指针,
int a[2][2];
int** p=a;//编译不通过.
int **p2=new int*[2];
for (int i=0; i<2; i++)
{
p2[i]=new int[2];
}
p2=a;//还是编译不通过
大家试着从内存分配的角度去解释下为什么不行??
我自己的理解如下:
如果编译器允许那样做的话,我们把二级指针指向了这个二维数组,但是二级指针指向的一级指针地址还是可以指向另外的对象地址的,这个时候二维数组里的一维数组的地址是变还是不变呢?显然二维数组中各个元素的地址在其声明的时候就已经定死了,肯定不能变,但糟糕的是二级指针里指向的一级指针要去改变这个地址,这样就肯定要出错了.
我觉得这样理解的话应该能讲得过去,不知哪位高手能再指点下!!!
[解决办法]
从内存分配的角度
int a[2][2]; 在栈上分配存4个int数据的内存.在逻辑上这段内存分为2行,每行两个数据.
int** p=a; 在栈上分配一个存地址的内存,保存a数组的首地址.从内存分配的角度,这里是没有错误的.强类型语言之所以报类型不匹配错误,是因为接下来的内存引用绝大多数情况会出现错误. 如果确实要这么用是可以强制转换的.比如用双指针作为函数参数,向函数内部传入不同大小的二维数组,这样的一个示例可以参考这里7楼.