gpt4 book ai didi

c - C中二维数组的内存映射

转载 作者:太空狗 更新时间:2023-10-29 16:37:46 24 4
gpt4 key购买 nike

你怎么看this discussion关于二维数组的内存映射是否正确? Especially this photo?你能解释一下这个理论吗?

假设我们像这样在 C 中声明一个二维数组:

int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};

现在,根据这个讨论,内存会像下面这样排列:

enter image description here

现在,我编写了以下代码来验证这个理论:

#include <stdio.h>

main()
{
int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};
printf(" arr==%d\n", arr);
printf(" &arr[0]==%d\n", &arr[0]);
printf(" arr[0]==%d\n", arr[0]);
printf("&arr[0][0]=%d\n", &arr[0][0]);
printf(" arr[0][0]=%d\n", arr[0][0]);
}
/*
Output:
========
arr ==1245028
&arr[0] ==1245028
arr[0] ==1245028
&arr[0][0]==1245028
arr[0][0]==10
Press any key to continue...
*/

为什么前 4 个输出相同?

最佳答案

See my question here.

这不是您访问二维数组信息的方式。事实上,您可以将它们视为 1-d,您可以在其中以特殊方式乘以和添加索引。

例如

int x[10] = {0,1,2,3,4,5,6,7,8,9};
int y[2][5] = {{0,1,2,3,4},{5,6,7,8,9}};

它们在内存中的格式完全相同,它们看起来像这样:

|0|1|2|3|4|5|6|7|8|9|

因此,要获取 8 元素,您可以请求 x[8]y[1][3]

对于第二种方式,您可以将其视为(1 * 5) + 3

这就是您的前 4 个相同的原因。你有:

  • arr:这是数组的起始地址
  • arr[0]:这是第一个子数组的起始地址,与整个数组的起始地址相同
  • &arr[0][0]:这是第一个子数组的第一个元素的地址,也是整个数组的开始
  • arr[0][0]:这是存储在第一个子数组的第一个元素中的值。

关于c - C中二维数组的内存映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6673719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com