San*_*ngh 2 c multidimensional-array
请考虑以下2-D阵列:
int array[2][2] = {
{1,2},
{3,4}
};
Run Code Online (Sandbox Code Playgroud)
根据我的理解: - 'array'表示二维数组的基地址(与数组的第一个元素的地址相同,即数组[0] [0]).
内存中二维数组的实际排列就像一个大型的一维数组.
现在,我知道base address = array.因此,我应该能够到达包含元素的内存块:array [0] [0].
如果我忘记了2-D数组的事情并尝试将此数组视为一个简单的1-D数组:array [0] =*(array + 0)给出第一个数组的基地址而不是元素数组[0 ] [0].为什么?
二维数组不存储任何内存地址(如指针数组).
如果我知道基址,我必须能够以线性1-维数组的形式访问该存储器.
请帮我澄清这个疑问.
谢谢.
小智 5
"你不要害怕poynter arythmethyc"......
int array[2][2] = { { 1, 2}, { 3, 4 } };
int *ptr = (int *)&array[0][0];
int i;
for (i = 0; i < 4; i++) {
printf("%d\n", ptr[i]);
}
Run Code Online (Sandbox Code Playgroud)
为什么这样做?C标准规定多维数组在内存中是连续的.这意味着,就其元素的顺序而言,2D阵列的排列方式是类似的
array[0][0]
array[0][1]
array[1][0]
array[1][1]
Run Code Online (Sandbox Code Playgroud)
当然,如果你把数组的地址作为指向int的指针(int *让我们命名ptr),那么这些项的地址如下:
ptr + 0 = &array[0][0]
ptr + 1 = &array[0][1]
ptr + 2 = &array[1][0]
ptr + 3 = &array[1][1]
Run Code Online (Sandbox Code Playgroud)
这就是为什么它最终有效.
array[0]是一维数组.它的地址与地址array相同,地址相同array[0][0]:
assert((void*)&array == (void*)&(array[0]));
assert((void*)&array == (void*)&(array[0][0]));
Run Code Online (Sandbox Code Playgroud)
既然array[0]是一个数组,你不能将它赋值给一个变量,也不能将它传递给一个函数(如果你试过,你将把指针传递给第一个元素).您可以通过查看(array[0])[0]和(array[0])[1](括号是多余的)来观察它是一个数组.
printf("%d %d\n", (array[0])[0], (array[0])[1]);
Run Code Online (Sandbox Code Playgroud)
您可以观察到它的大小是2个int对象的大小.
printf("%z %z %z\n", sizeof(array), sizeof(array[0]), sizeof(array[0][0]));
Run Code Online (Sandbox Code Playgroud)
这是一个代表内存布局的图表:
+-------------+-------------+-------------+-------------+
| 1 | 2 | 3 | 4 |
+-------------+-------------+-------------+-------------+
`array[0][0]' `array[0][1]' `array[1][0]' `array[1][1]'
`---------array[0]---------' `---------array[1]---------'
`-------------------------array-------------------------'
Run Code Online (Sandbox Code Playgroud)