考虑下面的 C 代码。
#include <stdio.h>
int main(){
unsigned int x[4][3] = {{1, 2, 3}, {4, 5, 6},
{7, 8, 9}, {10, 11, 12}};
printf("%u, %u, %u", x+3, *(x+3), *(x+2)+3);
printf("\n%u, %u, %u", x,&x,*x);
return 0;
}
现在每个 printf 语句都打印出与下面提到的相同的值。
6356724, 6356724, 6356724
6356688, 6356688, 6356688
Process returned 0 (0x0) execution time : 0.128 s
Press any key to continue.
我想知道每个 printf 语句的结果如何相同。 这是我对二维数组内存布局的理解。
现在我相信 x+3 指的是基地址(x + 3 * 指针运算所需的大小)= 24 和 *(x +3 ) = *(24) = 2036 但不是第一个 printf 语句打印 2036, 2036 2036 的情况。我想直观地了解二维数组的组织方式。
最佳答案
每当提到数组时,它都是decays指向其第一个元素的指针(除了目前不感兴趣的少数情况)。
为什么 x
, &x
和 *x
都印一样吗?这是因为数组本身,它的第一个元素(如果它是一个二维数组,它的第一个元素的第一个元素,它本身就是一个一维数组)都具有相同的地址。
所以:
-
&x
是指向数组的指针 -
x
是数组本身,它衰减到它的第一个元素的指针 -
*x
是数组的第一个元素,它本身就是一个数组(1, 2, 3}
, 所以它衰减到它的第一个元素的指针
所有这些指针都有不同的类型,但指向同一个地址。
同样的事情发生在 x+3
上和 *(x+3)
.一、x
衰减为指针,然后执行指针运算。说 y = x + 3
, 所以 y
和 *y
指向与 x
相同的地址和 *x` 做(见上文)。
那*(x+2)+3
呢? ?嗯,*(x + 2)
本身就是一个包含 3 个元素的数组。所以*(x+2)+3
指向 *(x + 2)
的 末尾 的一个元素大批。这个不存在的元素 has an address nevertheless , 它与 *(x + 3)
的第一个元素的地址相同数组 --- 因为 *(x + 2)
和 *(x + 3)
在 x
中彼此相邻大批。
关于C编程二维数组内存布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60720477/