You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中arr与&arr地址相同的原因是什么?

关于C语言中数组名、数组首元素地址和数组地址的疑问

运行下面的C语言程序后,输出显示arr、&arr[0]和&arr的地址完全相同。我理解数组名arr指向数组首个元素的地址,因此arr与&arr[0]地址一致,但无法理解为何arr与&arr的地址也相同,原本以为&arr会输出存储数组首元素地址的指针的地址。

代码:

#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

核心原因:地址值相同,但类型和含义完全不同

  • arr 和 &arr[0]:
    在C语言中,数组名arr在绝大多数场景下会被隐式转换为指向数组首元素的指针,它的类型是char*;&arr[0]是直接取数组第一个元素的地址,类型同样是char*。二者指向的都是数组第一个字节的位置,所以地址值完全一致。

  • &arr 的本质:
    &arr是取整个数组的地址,它的类型是char(*)[3](指向长度为3的char数组的指针)。虽然它的地址值和首元素地址相同,但这个指针指向的对象是整个数组,而非单个元素。

用指针偏移验证类型差异

可以通过指针加1的操作直观看到区别:

#include <stdio.h>

int main()
{
    char arr[3];
    char* p = arr;          // 指向首元素的指针
    char(*pa)[3] = &arr;    // 指向整个数组的指针

    printf("p = %p\n", p);
    printf("p+1 = %p\n", p+1);  // 偏移1字节(char的大小)

    printf("pa = %p\n", pa);
    printf("pa+1 = %p\n", pa+1); // 偏移3字节(整个数组的大小)

    return 0;
}

运行后会发现,p+1的地址比p大1,而pa+1的地址比pa大3——这就是因为二者的类型不同,指针偏移的步长由指向对象的大小决定。

简单来说:数组的起始位置就是首元素的起始位置,所以arr、&arr[0]和&arr的地址值相同,但&arr代表的是整个数组的地址,和前两者的语义完全不同。

内容的提问来源于stack exchange,提问作者Whiz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:55:17