结构体指针与内存地址:为何打印的两个值不同?
为什么结构体指针变量的地址和它指向的地址存在差异?
先看看你的代码(顺便提个小问题:结构体定义里的struct *next, *prev;应该改成struct Data *next, *prev;,不然编译器会报错哦):
struct Data { int num; struct Data *next, *prev; }; typedef struct Data sData; int main() { sData *head; head = NULL; printf("%lld %lld", head, &head); return 0; }
这个问题其实是对指针的本质理解不到位,我给你拆解清楚:
- 指针变量本身也是一块内存:
sData *head;这句话在栈上申请了一个指针变量,它和你定义的int a;一样,有自己专属的内存地址——这个地址就是&head。在64位系统里,这个变量占8字节;32位系统占4字节,用来存储另一个内存地址。 - 指针变量的值是它指向的目标地址:
head这个变量的内容,是它要指向的结构体的内存地址。你这里把它初始化成了NULL,所以它的值是一个空地址(通常是0x0)。 - 两者是完全独立的内存位置:举个生活化的例子,
head就像你手机里的联系人条目:条目本身存在你手机的存储里(对应&head),而条目里存的是你朋友的手机号(对应head的值)。当你还没存朋友号码时(NULL),条目里是空的,但条目本身依然在你的手机存储里有自己的位置。
所以你打印的两个值,一个是指针变量自己的内存位置,另一个是指针变量存储的空地址,自然不一样啦。
内容的提问来源于stack exchange,提问作者Bernard Wijaya
相关产品推荐
相关产品推荐

