【问题标题】:Why address of arr and &arr are same in "C"为什么 \"C\" 中 arr 和 &arr 的地址相同
【发布时间】:2022-11-25 13:12:11
【问题描述】:

通过在我的电脑上运行这个程序,我得到了相同的地址。我是针对array&array[0] 的情况,我知道array 的名称指向array 中第一项的地址。而且两者都是一样的。

但是我无法了解为什么array&array 的名称指向同一个地址。我想到的是,它将打印存储数组中第一项地址的指针的地址。

代码

#include <stdio.h>

int main()
{
    char arr[3];

    printf("array = %p\n", arr);
    printf("&array[0] = %p\n", &arr[0]);
    printf("&array = %p\n", &arr);

    return 0;
}

输出

array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D

【问题讨论】:

标签: arrays c pointers memory-address


【解决方案1】:

重要的是要注意,虽然数组和指针之间有一些相似之处,但它们是不是相同。

array 这个名字确实不是指向第一项的地址。它实际上是全部的大批。混乱来自这样一个事实,即最多上下文,数组的名称衰变指向其第一个成员的指针。

数组到指针衰减的两个值得注意的地方不是发生在数组是sizeof 运算符或地址运算符&amp; 的操作数时。关于后者,数组是一组连续的对象,并且(像任何对象一样)它有一个地址。数组的地址与其第一个成员的地址相同,因此 array(在表达式中使用时,或等效于 &amp;array[0])和 &amp;array 将具有相同的值但类型不同。

在您的特定情况下,&amp;array[0] 的类型为char *,而&amp;array 的类型为char (*)[3](即指向大小为 3 的 char 数组的指针)。

【讨论】:

    猜你喜欢
    • 2012-02-13
    • 1970-01-01
    • 2020-07-10
    • 2011-11-14
    • 2017-11-06
    • 2012-04-28
    • 2021-09-16
    • 2021-05-12
    • 2011-07-26
    相关资源
    最近更新 更多