c - 为什么数组变量等于它的地址?

标签 c arrays

<分区>

初学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??? 我现在很困惑,非常感谢您的帮助。

最佳答案

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

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

指针和数组之间的一个显着区别是 sizeof 运算符,它可以分辨出区别。假设 int 是 4 个字节,指针是 8 个字节,sizeof(arr) 将为您提供 12,而 sizeof(&arr) 将为您提供你 8.

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

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

关于c - 为什么数组变量等于它的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39900030/

相关文章:

javascript - Javascript 中 boolean 值和数组的困难

c - 了解一些源代码

c - 使用 struct 作为 "database"的任意数量单词(按字母顺序)的排序算法

c - 如何重新分配字符串?

c - 使用 "\x"十六进制字符转义的字符串连接

java - 用Java将数组写入文件

c - 为什么以 null 结尾的字符串?或者: null-terminated vs.个字符+长度存储

php - 如何在mysql查询中比较两个数组?

java - 尝试将 int 数组的内容复制到 Dimension 数组会导致 NullPointerException

c# - 将字符串数组转换为小写