C99环境下结构体指针与结构体变量地址不等的原因探究
为什么
&ptr和&var地址不相等? 这是个非常典型的新手误区,咱们把逻辑拆解开就清楚了:
核心概念区分
var是一个struct my_structure类型的普通变量,它在内存中拥有一块属于自己的存储空间,&var就是这块空间的起始地址。ptr是一个指针变量,它的作用是存储其他变量的地址,但它本身也是一个需要占用内存的变量!&ptr获取的是这个指针变量自己的内存地址,而不是它存储的内容。
你的代码逻辑解析
当你执行ptr = &var;时,你做的事情是:把var的地址(&var)写入到ptr这个变量的内存空间中,而不是让ptr和var共用同一个内存地址。
如果修改你的代码,添加一行打印ptr的内容:
#include <stdio.h> int main() { struct my_structure { char name[20]; int number; int rank; }; struct my_structure var = {"Stud", 35, 1}; struct my_structure *ptr; ptr = &var; printf("%p ", &var); // 打印var的地址 printf("\n"); printf("%p ", &ptr); // 打印指针变量ptr自己的地址 printf("\n"); printf("%p ", ptr); // 打印ptr存储的内容,也就是var的地址 return 0; }
运行后你会发现,第三行的输出和第一行完全一致——这才是ptr = &var;真正带来的效果。
通俗类比
你可以把ptr想象成一个小笔记本:
- 笔记本自己有一个存放的位置(就是
&ptr) - 你在笔记本里写下了
var的地址(就是ptr存储的内容) - 而
var本身是另一个独立的盒子,它的位置是&var
这三个东西的地址当然不一样啦!
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

