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

C语言中指针的地址是什么?为何打印&p与p得到的内存地址不一致

两个输出值的本质差异

你之所以出现认知偏差,是混淆了指针变量的两个完全独立的属性:

  • &p 是指针变量p自身的内存地址:你定义int *p时,编译器会在当前函数栈上给p这个变量分配一块内存(通常在64位系统下占8字节),&p就是这块内存的起始地址,这个值是固定且合法的,就是你输出的第一个值0x16b77f710。
  • p 是指针变量内部存储的指向目标的地址值:你的代码只声明了p但没有对它做任何赋值操作,它属于未初始化的野指针,内部存储的是对应栈内存之前残留的随机垃圾值,也就是你看到的第二个输出0x104683f4c,这个值没有任何实际意义,读取未初始化的局部变量本身也属于C语言标准规定的未定义行为。

补充验证示例

你可以修改代码验证两者的差异:

int main()
{
    int a = 10;
    int *p = &a; // 给p赋值,让它指向变量a

    printf("指针p自身的地址 &p = %p \n", &p);
    printf("指针p存储的指向地址 p = %p \n", p);
    printf("变量a自身的地址 &a = %p \n", &a); // 这个值会和p的输出完全一致
    return 0;
}

运行后你会发现p的值和&a的值完全相同,和&p的取值完全不同,就可以明确两者的区别了。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 04:15:03