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
相关产品推荐
相关产品推荐

