【发布时间】:2021-06-29 21:12:51
【问题描述】:
在许多 C 编程的教程视频和解释中,用于表示数组,如
int a[5] = {9,2,1,3,4};
导师/教师总是制作一个单独的盒子来存储数组的第一个元素的地址,即在这种情况下为 9 的地址。
这意味着数组消耗的总内存应该是(常量指针a存储第一个元素的地址所消耗的内存+5*(sizeof(int))。
如果是这样,那么为什么下面提到的这个程序会给出这样的输出。
程序
#include <stdio.h>
int main()
{
int a[5] = {6,1,2,9,3};
int * p = a;
printf("a is %u\n", a);
printf("&a is %u\n", &a);
printf("&a+1 is %u\n", &a+1);
printf("p is %u\n", p);
printf("&p is %u", &p);
return 0;
}
输出
a is 2128206832
&a is 2128206832
&a+1 is 2128206852
p is 2128206832
&p is 2128206824
这里a 和&a 给出相同的地址。
在查看人们主要用来表示 C 中的数组的表示时,根本不应该是这种情况。
根据他们对数组的图表表示,它应该为a 和&a 赋予不同的值,就像p 和&p 一样。
那么数组是如何在内存中真正表示的呢?
抱歉,我有这样一个微不足道的疑问,但我很困惑。
-
a是否创建了一个单独的内存空间来存储数组的第一个元素的地址? - 如果是,那么为什么
a和&a给出相同的值? - 应该和
p和&p一样。
【问题讨论】:
-
是否创建了一个单独的内存空间来存储数组的第一个元素的地址?不,数组总是在连续的区域中
-
别害羞。向我们展示您的图表来证明您的观点。此外,
printf为指针格式化字符是p而不是u。printf("p is %p\n", p); -
可能你混淆了数组和锯齿数组:en.wikipedia.org/wiki/Jagged_array
-
@ChefGladiator
printf("p is %p\n", (void *)p);需要演员表。 -
a 可以看作是指向 a[0](即 int)的指针,&a 可以看作是指向 5 个 int 数组的指针。您可以在这里找到问题的答案:geeksforgeeks.org/…
标签: arrays c pointers reference memory-address