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

A *a = new A();

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

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

【问题讨论】:

    标签: c++ pointers


    【解决方案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* = ...

              【讨论】:

                猜你喜欢
                • 2021-12-17
                • 1970-01-01
                • 1970-01-01
                • 2010-12-08
                • 2019-01-06
                • 2014-05-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多