use*_*312 13 c multidimensional-array
您认为关于2D阵列的内存映射的讨论是正确的吗?特别是这张照片?你能解释一下这个理论吗?
假设我们在C中声明一个2D数组,如下所示:
int arr[3][3]={10, 20, 30, 40, 50, 60, 70, 80, 90};
Run Code Online (Sandbox Code Playgroud)
现在,根据这个讨论,内存将按如下方式排列:

现在,我编写了以下代码来测试这个理论:
#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...
*/
Run Code Online (Sandbox Code Playgroud)
为什么前4个输出相同?
Chr*_*per 15
这不是您访问有关二维数组的信息的方式.实际上,您可以将它们视为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}};
Run Code Online (Sandbox Code Playgroud)
它们在内存中的格式完全相同,它们看起来像这样:
|0|1|2|3|4|5|6|7|8|9|
Run Code Online (Sandbox Code Playgroud)
所以要获得8元素,你可以要求x[8],或者y[1][3].
对于第二种方式,您可以将其视为(1 * 5) + 3.
这就是为什么你的前4个是相同的.你有:
arr:这是数组开头的地址arr[0]:这是第一个子数组的起始地址,与整个数组的起始地址相同&arr[0][0]:这是第一个子数组的第一个元素的地址,也是整个数组的开头arr[0][0]:这是存储在第一个子数组的第一个元素中的值. hug*_*omg 10
你的代码只使用一个普通的多维数组,但是图像描述了一个指针数组,就像你在编写事物时通常所做的那样.
多维数组基本上只是一个普通的,扁平的数组(在内存中),带有一些额外的合成糖用于访问.因此,虽然可以从arr [i]获取指针,但是没有额外的"变量"来存储它,就像在图像中一样.
以校正图像,取出与所述各部分arr[0], arr[1]...和改变的值arr,以1245039(相同&ARR [0] [0]).