微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在许多 C 编程教程视频和解释中,用于表示数组,如 int a[5] = {9,2,1,3,4}; 导师/老师总是制作一个单独的盒子来存储数组的第一个元素的地址,即在这种情况下为 9 的地址。

也就是说数组消耗的总内存应该是(常量指针a用来存储第一个元素的地址所消耗的内存+5*(sizeof(int)) .

如果是这样,那么为什么下面提到的这个程序会给出这样的输出

程序

#include <stdio.h>
int main() 
{ 
    int a[5] = {6,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 一样不同。

解决方法

不,a 不会创建单独的内存来存储数组的地址。 &a 给出了数组的地址,a 给出了 a[0] 的地址。 &a 和 a 都是相同的 a,因为第一个元素的地址与数组的地址相同。 int a[5] 完全符合它的外观,生成 5 个元素的数组。创建 p 时,您创建了一个单独的变量,其值为 &a[0]。为了更清楚,您可以查看此内容。您还应该查看 this

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。