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)
&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数组 ...没有帮助......
所以数组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].这就解释了为什么a和a[0]
也评价为同一地址&a,&a[0]和&a[0][0].
数组的地址和该数组中第一个元素的adddress相同的事实并不令人惊讶:同样的事情也发生struct了.鉴于:
struct { int a; int b; } x;
Run Code Online (Sandbox Code Playgroud)
你会发现&x并且&x.a是相同的地址(尽管有不同的类型).
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |