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

为什么无需实例化结构体对象即可获取并打印其数据成员的地址?

问题解答

这段代码的实际输出内容

这段代码的输出由std::ostream的隐式转换规则决定:

  • C++标准库没有为指向非静态成员的指针重载operator<<,因此int test::*类型的p会发生隐式转换:所有指向成员的指针都可以隐式转换为bool类型,非空的成员指针转换结果为true。
  • 默认配置下std::cout输出bool类型时会转成整数输出,因此你最终会看到输出1;如果开启了std::boolalpha格式控制,会输出字符串true。

test::whatever的存储与取地址逻辑

你通过&test::whatever拿到的不是某个具体成员的内存地址,而是指向类成员的指针,它的语义和普通对象指针完全不同:

  • 类的非静态成员本身没有独立的内存地址,必须依附于类的实例存在。成员指针本质存储的是该成员在类实例内存布局中的偏移量,对于你给出的test结构体,whatever是第一个成员,没有额外内存对齐填充的情况下这个偏移量通常为0。
  • 这个偏移量是类的静态属性,和具体实例无关,因此不需要创建test的对象,就可以直接通过类名获取到这个偏移值,封装为成员指针。这是C++标准明确支持的合法语法,因此编译器不会抛出警告或错误。
  • 只有把成员指针绑定到具体实例时,才能拿到实际的成员地址:比如test obj; int* addr = &(obj.*p);得到的addr才是obj对象中whatever成员的真实内存地址。

内容的提问来源于stack exchange,提问作者Karen Baghdasaryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:27:03