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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:26:38