【问题标题】:Why is an array variable equal to its address? [duplicate]为什么数组变量等于它的地址? [复制]
【发布时间】:2016-10-06 15:28:50
【问题描述】:

我是 C 编程新手,有一个问题困扰着我。 我们来看下面这段代码:

int main()
{
   int arr[3]={1,2,3};
   printf("%d\n", arr);
   printf("%d", &arr);
}

如果我运行此代码,它会为 arr 和 &arr 提供相同的结果。但为什么 arr=&arr? 我已经看到了很多关于这个主题的答案,但我都不清楚。简而言之,人们同意数组变量保存数组第一个元素的地址,例如,arr 保存 arr[0] 的地址,比如 arr= 4340。那么变量 arr 必须存储在内存中的某个位置,并且&arr 是存储值 4340 的内存单元的地址。如果 &arr = arr 则结果是 4340 存储在地址 4340。但是地址 4340 的值是数组的第一个元素的值,所以它应该是1??? 在这一点上我很困惑,非常感谢一些帮助。

【问题讨论】:

  • 阅读comp.lang.c FAQ 的第 6 部分。它很好地解释了 C 中数组和指针之间经常令人困惑的关系。(规则 1:数组不是指针。)
  • @Keith Thompson:感谢您的参考!我一定会看的。

标签: c arrays


【解决方案1】:

您在这里的困惑与数组和指针的等效性有关。也就是说,数组不是指针,而是在某些情况下,数组衰减变成指针。

数组不保存第一个元素的地址,而是一组连续的基本类型元素。数组本身的地址恰好是第一个元素的地址。

指针和数组之间有显着差异的一个地方是sizeof 运算符可以分辨出差异。假设 int 是 4 个字节,一个指针是 8 个字节,sizeof(arr) 会给你 12,而sizeof(&arr) 会给你 8。

当您将arr 传递给函数时,它会衰减为指向第一个元素的指针。所以打印arr 和&arr 会得到相同的值。

话虽如此,您应该始终使用%p 而不是%d 来打印指针,因为这会导致未定义的行为。

【讨论】:

  • 真的会导致未定义的行为吗?我认为它只会在 sizeof(int) != sizeof(void*) 的平台上打印不正确的值
  • @AlejandroDíaz 地址不一定是数字。例如,在 DOS 上,地址不是一个数字,而是两个数字。
【解决方案2】:

您的程序的行为是未定义。您不能使用%d 作为数组类型的格式说明符或数组类型的地址。您可以通过 arr[0] 来获取该数组中第一个元素的值。

偶尔arr 会衰减 指向int* 类型的指针,例如当它被传递给函数时。事实上,arr 等于 &arr,因为它们是 printf 的参数,格式说明符更正为 %p,这也是由于指针衰减。

【讨论】:

  • 使用有效的%p时仍然会发生。
  • 我的错误。这是因为arr 衰减为指针。请参阅我修改后的答案和@dbush 答案,这比我的要好。
猜你喜欢
  • 2011-03-08
  • 2011-08-24
  • 2017-04-07
  • 2019-08-30
  • 1970-01-01
  • 2020-10-17
  • 2012-03-17
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多