我对 C 中的指针和数组的问题感到困惑。
我们先来看一段代码:
//case 1
int **a;
a = (int **)malloc(sizeof(int*)*m);
for(i = 0; i < m; i++)
a[i] = (int *)malloc(sizeof(int)*n);
//case 2
int b[m][n];
然后,我们知道,b
内存中的布局如下:
b[0][0] b[0][1] ... ... b[m-1][n-1]
并且,a 在内存中的布局如下:
a
\
_\|
a[0] a[1] ... a[m-1]
| |
| |
| \|/
| a[1][0] a[1][a] ... a[1][n-1]
\|/
a[0][1] a[0][2] ... a[0][n-1]
所以,我的问题是:既然a[0..m-1][0..n-1]
不连续地存储在内存中,为什么我们可以使用下标运算[]
符a
?换句话说,为什么a[i][j]
能得到正确的元素,就b[i][j]
这样呢?