在 C++ 中,如何获取存储类实例字段值的地址?

Posted

技术标签:

【中文标题】在 C++ 中,如何获取存储类实例字段值的地址?【英文标题】:In C++, how to get the address in which the value of a class instance's field is stored? 【发布时间】:2009-06-29 15:52:54 【问题描述】:
class A 
   public: int i;
;

A *a = new A();

如何获取a->i的地址?我尝试了&a->i&(a->i),但那些会产生编译时错误:

“'.i' 的左边必须有类/结构/联合类型”

【问题讨论】:

【参考方案1】:

您没有提供您尝试编译的相同代码。始终复制和粘贴。您的代码中的说明是您没有语法正确的类声明或变量声明,并且当您声称您只使用了a->i 时,您的错误消息谈论的是“.i”。这是工作代码:

#include <stdio.h>
class A 
    public:
        int i;
;

int main() 
    A* a = new A();
    int* i = &a->i;
    printf("a: %p\na->i: %p\n", a, i);
    return 0;

最终,您您尝试获取成员地址的语法是正确的。错误消息说您尝试的语法是a.i。那不起作用,并且由于错误消息给出的原因。变量a 不是类、结构或联合类型。相反,它是指向其中一种类型的指针。您需要取消引用指针以获取成员。

当我运行它时,我得到了这个:

$ ./a.out 答:40748 a->i: 40748

地址是相同的,因为A 是一个简单的类,所以这个输出是意料之中的。第一个成员经常被放置在类记忆的最开始。向类添加第二个成员变量并获取其地址;你应该会看到不同的值。

【讨论】:

【参考方案2】:

在 C++ 中:

class A 
    public:         // note colon after public
        int i;
;                  // note semicolon after bracket

A *a = new A();     // note *a not a*

打印:

cout << ios::hex << &a->i << endl;

对我来说,这似乎工作正常。

【讨论】:

【参考方案3】:

&a->我应该工作。在您的情况下,因为该类只有一个公共整数,所以 a 和 i 的地址都是相同的。

【讨论】:

【参考方案4】:

你在正确的轨道上,但从你提到的编译错误来看,听起来你在输入“&amp;a.i

class A 

   public: 
       int i;
;

...

A *a = new A();
int *i = &a->i;

【讨论】:

【参考方案5】:

这段代码似乎可以编译?

class A 
   public:
      int i;
;
int main() 
   A *a = new A();
   int *x = &a->i;
   return 0;

【讨论】:

【参考方案6】:

以下内容适用于我使用 g++

class A

public:
    int m_i;
;

int
main()

    A* a = new A();
    int* i_ptr = &(a->m_i);

    return 0;

我猜你的意思是 A* a = ... 而不是 A a* = ...

【讨论】:

以上是关于在 C++ 中,如何获取存储类实例字段值的地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中获取嵌套类的实例

具有正确地址但具有另一个随机值的 C++ 指针?

如何从 if 语句中获取类模板的实例? (C++)

我将如何存储类的成员函数?

获取从抽象类继承并在属性中具有特定值的类的实例

使用 COM 在 C++ 中实例化 C# 类成员