C中的数组是否需要单独的内存来存储第一个元素的地址?

Does arrays in C takes separate memory to store the address of the first element?

在许多 C 编程的教程视频和解释中,用于表示像这样的数组 int a[5] = {9,2,1,3,4}; Tutors/teachers 总是制作一个单独的框来存储数组第一个元素的地址,即在这种情况下为 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给出a[0]地址。 &a 和 a 都是相同的 a,因为第一个元素的地址与数组的地址相同。 int a[5] 完全符合它的样子,生成 5 个元素的数组。创建 p 时,您创建了一个单独的变量,该变量的值为 &a[0]。您可以对此进行更清楚的了解。你还应该看看 this