首先,这是两个东西。
一维数组和一维指针的寻址方式是一样的(顺着内存地址往下)。
二维数组不能用二重指针表示,它们寻址方式不一样,二维数组撑死可以当作存放指针的数组
类似 int (*p)[10]; 也就是说不定的只有一维,二维数组在内存里也是顺序存放的。
此时如果用 int **p = a[2][2] = {{1,2},{3,4}};
则 p[0] = 1,p[1] = 2,p[2] = 3, p[3] = 4,
而p[0][0]会指向 *( *(p + 0) + 0 ) 也就是 *(1),访问地址为1的内存肯定是会报错的
再来几个例子 p[0][1] 相当于 *( *(p + 0 ) + 4 ) 相当于 *(5)
p[1][1] 相当于 *( *(p + 4 ) + 4) 相当于 *(6)
这里+4是内存中移动4(int是4个字节),对于指针的偏移是1。
#include<iostream>
using namespace std;
int main()
{
int a[2][2] = {{1,2},{3,4}};
int **p = (int **)a;
for(int i = 0; i < 4 ; i++)
{
cout<<p[i]<<endl;
}
cout<<p[1][1]<<endl;
return 0;
}
测试代码,暴出异常的时候中断看输出就知道具体访问的内存地址
so,寻址的时候尽量用简单点的,尽量用一维
如果实在要用,要记得二维数组和二维指针(指向指针的指针)不是一个东西。