用于2d /多维阵列的MEMORY MAP

1 c memory arrays memory-management 2d

任何人都可以直观地解释2D数组如何存储在内存中:a,&a,&a [0],a [0]都具有相同的地址......它似乎是指向某种方式的指针. ..那是对的......这已经困扰了我近一年了,在网上搜索也让我无法回答.....帮助真的很感激.... thanx

enter code here

#include<stdio.h>

int main()
{
    int a[2][3]={10,20,30,40,50,60};

    int row =0,col=0;

    printf("&a = %d ",&a);    
    printf("\na = %d ",a);
    printf("\n&a[0] = %d ",&a[0]);
    printf("\na[0] = %d ",a[0]);
    printf("\n&a[1] = %d ",&a[1]);
    printf("\na[1] = %d ",a[1]);
    printf("\n&a[0][0] = %d ",&a[0][0]);

    int *p;
    printf("\n\n sizeof(p) = %d ",sizeof(p) );

    printf("\n\n sizeof(a) = %d ",sizeof(a) );
    printf("\n\n sizeof(&a) = %d ",sizeof(&a) );
    printf("\n\n sizeof(&a[0]) = %d ",sizeof(&a[0]) );
    printf("\n\n sizeof(a[0]) = %d ",sizeof(a[0]) );
    printf("\n\n sizeof(&a[1]) = %d ",sizeof(&a[1]) );
    printf("\n\n sizeof(a[1]) = %d ",sizeof(a[1]) );
    printf("\n\n sizeof(&a[0][0]) = %d ",sizeof(&a[0][0]) );
}
Run Code Online (Sandbox Code Playgroud)

OUTPUT

&a = 2293536
a = 2293536
&a[0] = 2293536
a[0] = 2293536
&a[1] = 2293548
a[1] = 2293548
&a[0][0] = 2293536

sizeof(p) = 4

sizeof(a) = 24

sizeof(&a) = 4

sizeof(&a[0]) = 4

sizeof(a[0]) = 12

sizeof(&a[1]) = 4

sizeof(a[1]) = 12

sizeof(&a[0][0]) = 4
Run Code Online (Sandbox Code Playgroud)

不要把我引用到存储器映射中用于C中的2D数组 ...没有帮助......

caf*_*caf 5

所以数组a是一个占用内存块的对象:

| a                                                         |
Run Code Online (Sandbox Code Playgroud)

它是一个长度为2的数组,所以如果我们绘制构成它的元素,它看起来像这样:

| a[0]                        | a[1]                        |
Run Code Online (Sandbox Code Playgroud)

a[0] 反过来是一个长度为3的数组,看起来像这样:

| a[0][0] | a[0][1] | a[0][2] |
Run Code Online (Sandbox Code Playgroud)

a[1]看起来一样,所以我们可以重新绘制数组a,如下所示:

| a[0][0] | a[0][1] | a[0][2] | a[1][0] | a[1][1] | a[1][2] |
Run Code Online (Sandbox Code Playgroud)

请注意a,a[0]并且a[0][0]都位于内存中的同一点:对象的开始a.但是,它们确实有不同的大小:a整个"2D数组",a[0]是一个常规数组,并且a[0][0]是一个单独的`int.

这解释了为什么&a,&a[0]并且&a[0][0]是相同的地址(虽然它们有不同的类型) - 它们是位于内存中相同点的事物的地址.

另外,有一个规则,如果一个数组是在一个表达式中计算的,它不是一元&sizeof运算符的主题,它会计算一个指向它的第一个元素的指针:也就是说,使用plain a等价于&a[0].既然a[0]也是一个数组,使用plain a[0]就相当于&a[0][0].这就解释了为什么aa[0] 也评价为同一地址&a,&a[0]&a[0][0].

数组的地址和该数组中第一个元素的adddress相同的事实并不令人惊讶:同样的事情也发生struct了.鉴于:

struct { int a; int b; } x;
Run Code Online (Sandbox Code Playgroud)

你会发现&x并且&x.a是相同的地址(尽管有不同的类型).