还不能理解,我再给你个例子:
int a[2][2] = {1,2,3,4}
在内存中,a是被连续存放的 1 2 3 4,其中一个int占4个byte
之所以可以用a[1][1]引用到4,是(a+2*1+1),而正是int告诉了a应该偏移4个byte,而2是第二维的大小。所以才能正确索引;
现在int **p那么p[1][1]的访问形式是*(*(p+1)+1);
如果p = new int*[2];p[0] = new int[2];p[1] = new int[2];
ok,p指向new int*[2]的首地址,p+1偏移1个byte(int*占一个byte),在解引用*(p+1)根据p[1] = new int[2],得到一个指向大小为2的int数组,*(p+1)+1
偏移4个byte,再解引用,得到期望的p[1][1];
但是如果 int (*p)[2] = a;那么p知道自己可以是指向一个大小为2的int数组,所以p[1][1],p+1得到p的偏移是2*4byte,解引用得到一个int型指针,指向大小为2的数组的首地址,在*(p+1)+1,偏移4个byte,再解引用,得到p[1][1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好累,当我自己也做个总结,再不明白我就没法了。指针太多,难免笔误,自己耐心看。