【问题标题】:Does arrays in C takes separate memory to store the address of the first element? [duplicate]C 中的数组是否需要单独的内存来存储第一个元素的地址? [复制]
【发布时间】: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&amp;a 给出相同的地址。 在查看人们主要用来表示 C 中的数组的表示时,根本不应该是这种情况。 根据他们对数组的图表表示,它应该为a&amp;a 赋予不同的值,就像p&amp;p 一样。 那么数组是如何在内存中真正表示的呢? 抱歉,我有这样一个微不足道的疑问,但我很困惑。

  • a 是否创建了一个单独的内存空间来存储数组的第一个元素的地址?
  • 如果是,那么为什么 a&amp;a 给出相同的值?
  • 应该和p&amp;p 一样。

【问题讨论】:

  • 是否创建了一个单独的内存空间来存储数组的第一个元素的地址?不,数组总是在连续的区域中
  • 别害羞。向我们展示您的图表来证明您的观点。此外,printf 为指针格式化字符是 p 而不是 uprintf("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


【解决方案1】:

不,a 不会创建单独的内存来存储数组的地址。 &amp;a 给出了数组的地址,a 给出了a[0] 的地址。 &a 和 a 都是相同的 a 因为第一个元素的地址与数组的地址相同。 int a[5] 完全按照它的样子,生成 5 个元素的数组。创建 p 时,会创建一个单独的变量,其值为 &amp;a[0]。您可以查看此内容以获得更清晰的信息。你也应该看看this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-19
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多