C++ 当使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址?

C++ 当使用指向成员的指针时,如何通过作用域解析运算符获取类成员的地址?,c++,class,pointers,scope,pointer-to-member,C++,Class,Pointers,Scope,Pointer To Member,当使用指向成员(又名点星或箭头星)的指针访问类成员时,我们可以使用以下语法: A * pa; int A::*ptm2 = &A::n; std::cout << "pa->*ptm: " << pa->*ptm << '\n'; A*pa; int A::*ptm2=&A::n; std::cout当您声明指向成员数据的指针时,它不会绑定到任何特定实例。如果您想知道给定实例的数据成员的地址,则需要在执行*或->*之后获取结果的地址。例如

当使用指向成员(又名点星或箭头星)的指针访问类成员时,我们可以使用以下语法:

A * pa;
int A::*ptm2 = &A::n;
std::cout << "pa->*ptm: " << pa->*ptm << '\n';
A*pa;
int A::*ptm2=&A::n;

std::cout当您声明指向成员数据的指针时,它不会绑定到任何特定实例。如果您想知道给定实例的数据成员的地址,则需要在执行
*
->*
之后获取结果的地址。例如:

#include <stdio.h>

struct A
{
  int n;
};

int main()
{
  A a  = {42};
  A aa = {55};
  int A::*ptm = &A::n;
  printf("a.*ptm: %p\n", (void *)&(a.*ptm));
  printf("aa.*ptm: %p\n", (void *)&(aa.*ptm));
}

对于成员变量,它是从对象实例开始的偏移量<代码>->*
大致相当于它的LHS(实例)和RHS(偏移量)部分的简单相加。@syam我就是这么想的。但是如果我为多个成员变量打印
&A::member\u variable
,我会得到所有变量的
1
;考虑虚拟函数、多重继承等。“指向成员的指针”的内部表示可能会变得非常复杂。有些实现最多使用16个字节(例如,请参阅)@user2141130这是因为当您尝试打印它时,它不会打印偏移量本身,而是转换为其他内容(我认为是布尔值,但我现在不能检查它——无论如何,您知道了,您没有打印您所想的内容)。@Nemo好的观点,谢谢。我做了一个小编辑,以避免给别人我的坏主意!
a.*ptm: 0xbfbe268c
aa.*ptm: 0xbfbe2688