C编程二维数组内存布局

标签 c arrays multidimensional-array data-structures

考虑下面的 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 语句的结果如何相同。 这是我对二维数组内存布局的理解。 2-D array memory layout

现在我相信 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/

相关文章:

c - C 是否在右括号之前销毁返回变量?

javascript - 根据值从索引数组中删除元素

python - 初始化和填充 numpy 数组的最佳方法?

c++ - 退回 VLA 安全吗?

c - Windows Phone 和 ANSI C(非 C++)库

java - 如何将数组添加到 arrayList 而不替换列表中的其他数组

arrays - 定义派生类型数组

numpy - 如何在 Python/numpy 中将 3D 数组结果保存到 4D 数组?

python - 标准化 ndarray 的切片

c - 在 numpy vector 上使用标量 C 函数