【问题标题】:Address of memory [duplicate]内存地址[重复]
【发布时间】:2019-05-07 10:13:58
【问题描述】:

在这段代码中,

int a[] = {1, 2, 3, 4, 5};
printf("a = %p, &a = %p\n", a, &a);

打印a&a 的相同地址。据我所知,a 是指向数组第 0 个元素的 const 指针。为什么a的地址和内容是一样的?

【问题讨论】:

  • 当您使用%p 规范时,不要忘记将参数转换为void *printf("a = %p, &a = %p\n", (void *)a, (void *)&a)
  • a 不是 const 指针;它是一个数组。看看重复的。

标签: c arrays memory-address


【解决方案1】:

为什么a的地址和它的内容相等?

他们不是。

在大多数情况下,数组类型的变量衰减为指向第一个元素的指针。因此

printf("1. %p, 2. %p", (void*)a, (void *)&a[0]);

将打印相同的值。

也就是说,数组的地址,和数组的第一个元素的地址是一样的,所以

 printf("1. %p, 2. %p", (void*)a, (void*)&a);

也打印相同的。但是,请记住,它们不是同一类型。

  • a,在这种情况下与&a[0] 相同,属于int * 类型
  • &a,属于int *[5] 类型,即指向由5 个ints 组成的数组的指针。

【讨论】:

  • a如何存储在内存中?任何指针变量在内存中都是 4(或 8)字节,值 = 指针指向的变量的地址。数组名不正确吗?
  • @yousefrashidi 它根本不存储在内存中。参考文献int a 的地址是如何存储在内存中的?!不是每个int a 实际上都需要 12 个字节的内存,a 需要 4 个字节,其地址需要 8 个字节吗?!”这个地址存储在哪里?” 指针一直向下...
猜你喜欢
  • 2021-04-08
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2016-05-18
  • 2017-11-12
  • 1970-01-01
  • 2013-04-30
  • 2020-12-06
相关资源
最近更新 更多