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

时间:2009-06-29 15:52:54

标签: c++ pointers

class A {
   public: int i;
};

A *a = new A();

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

“.i'的左边必须有class / struct / union类型”

6 个答案:

答案 0 :(得分:8)

您没有提供尝试编译的相同代码。始终复制并粘贴。您的代码中的告知是您没有语法正确的类声明或变量声明,并且当您声称仅使用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
a: 40748
a->i: 40748

地址是相同的,因为A是一个简单的类,所以这个输出是预期的。第一个成员经常放在班级记忆的最开头。将第二个成员变量添加到类中并获取其地址;你应该看到不同的价值观。

答案 1 :(得分:0)

在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;

对我来说这似乎没问题。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

class A 
{
   public: 
       int i;
};

...

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

答案 4 :(得分:0)

此代码似乎可以编译?

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

答案 5 :(得分:0)

以下适用于我使用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* = ...