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

结构体指针与内存地址:为何打印的两个值不同?

为什么结构体指针变量的地址和它指向的地址存在差异?

先看看你的代码(顺便提个小问题:结构体定义里的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:24:32