C中二维数组的内存映射

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]).