【问题标题】:How does an array appear to hold a pointer value and an element value at the same location in memory? [duplicate]数组如何在内存中的同一位置保存指针值和元素值? [复制]
【发布时间】:2022-01-12 19:20:18
【问题描述】:

如果我有一个 int 数组 intArr[4] 并得到它指向的地址,就像这样 printf("%p\n", intArr,);

然后得到数组的地址 printf(“%p\n”, &intArr);

两个语句返回相同的地址

0xffffcc14

0xffffcc14

然后,当它通过 intArr[0] 或 *intArr 取消引用时,它会给出一个整数值。

所以我想知道发生了什么,使数组看起来好像在同一个内存位置同时保存了两个东西:一个指向自身的指针值和一个元素值?

【问题讨论】:

  • 它没有。数组在传递给printf 时会衰减为指针,因此会打印第一个元素 的地址值。当&intArr 被打印时 - 它是数组本身的地址,出于显而易见的原因,它与第一个元素相同。

标签: arrays c pointers memory implicit-conversion


【解决方案1】:

你声明的数组

intArr[4];

实际上是一个命名的内存范围。所以数组的地址和它的第一个元素的地址就是数组所占用的内存范围的地址。

&intArrintArrprintf 的调用中使用的表达式之间的唯一区别是它们的类型。第一个表达式的指针类型为int ( * )[4],第二个表达式的指针类型为int *,但表达式生成的值彼此相等。

在本次通话中

printf("%p\n", intArr,);

数组指示符被隐式转换为指向其第一个元素的指针。

在表达式中使用的数组(例如在sizeof 运算符中使用)会被隐式转换为指向其第一个元素的指针。

例如,如果你会写

printf( "%zu\n", sizeof( intArr ) );

你会得到数组的大小。

另一方面,如果你会写

printf( "%zu\n", sizeof( intArr + 0 ) );

您将获得指针的大小,因为在此表达式 intArr + 0 中,数组指示符被隐式转换为指向其第一个元素的指针。

对于这些表达式intArr[0]*intArr,那么第一个表达式的求值类似于*( intArr + 0 ),与*intArr 相同。

【讨论】:

  • 谢谢,我想我想问的是,当数组衰减为指针时,存储的指针地址在哪里?因为 intArr[0] 持有一个 int 值,而不是指针值。我希望这与我刚才问的不同。
  • @user17917376 数组地址无处存储。编译器跟踪所有变量的地址,链接器解析它们。
猜你喜欢
  • 1970-01-01
  • 2020-06-20
  • 2012-10-17
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多