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

C语言中数组名、数组首元素及自定义指针的地址关系疑问

C语言中数组名、数组首元素及自定义指针的地址关系疑问

咱们先把你问的两个问题拆开来聊清楚哈,你的结论其实是完全正确的,给你点个赞!

首先说第一个问题:数组名的地址和数组首元素的地址数值是相同的。在C语言里,数组名(比如a)在绝大多数场景下会被隐式转换成指向数组首元素的指针,所以当你打印a、&a[0]甚至&a的时候,会看到它们的内存地址数值完全一样——因为数组的首元素本来就存在整个数组内存块的起始位置,所以这几个指向的是同一块内存的起点。不过要注意,它们的类型是不一样的:&a是指向整个数组的指针(比如如果是int a[5],那&a的类型就是int (*)[5]),而a和&a[0]是指向单个int元素的指针(int *),但数值上确实是同一个地址。

然后是第二个问题:你定义的指针p自己的地址,和数组首元素、数组名的地址完全不同。指针p本身是一个独立的变量,它有自己的内存空间(通常在栈上),它的作用只是把a[0]的地址值存了进去而已。打个比方,就像你把朋友家的地址写在小本子上,小本子自己有个存放位置(这就是&p),而小本子上写的朋友家地址是&a[0],这俩肯定不是一回事对吧?

咱们可以用一段代码直观验证一下:

#include <stdio.h>

int main() {
    int a[5] = {1,2,3,4,5};
    int *p = &a[0];

    printf("&a[0] 的地址: %p\n", &a[0]);
    printf("数组名a转指针后的地址: %p\n", a);
    printf("&a(整个数组的地址): %p\n", &a);
    printf("指针p保存的地址值: %p\n", p);
    printf("指针p自己的地址&p: %p\n", &p);

    return 0;
}

运行这段代码你会发现,前四行打印的地址数值是一样的,但最后一行&p的地址和前面完全不同,这就完美印证了你的结论。

总结一下核心点:

  • 数组首元素地址、数组名隐式转换后的指针地址、整个数组的地址,数值相同,指向数组内存的起始位置;
  • 自定义指针p的自身地址是独立的,它只是存储了首元素的地址值,和数组相关的地址没有关系。

备注:内容来源于stack exchange,提问作者Mohd Saq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:55:28