【问题标题】:Changing the address of a pointer after construction构造后更改指针的地址
【发布时间】:2020-01-02 13:19:01
【问题描述】:

我尝试创建一个最小的问题示例。我正在尝试检查 void 指针的地址是否为NULL。该地址应该通过构造类来提供,并且应该是const。我写了下面的类。

MyPointer.h:

public:
    MyPointer(const void* activeApp) : m_activeApp(activeApp){
        std::cout <<"adresse on construction: " << m_activeApp << std::endl;
    };
MyPointer.cpp:
    void printAdress();
private:
    const void* m_activeApp;
};

方法“printAdress”应该能够打印给定指针的正确地址。

int main(void){
   void* p_activeApp = nullptr;
   std::cout << p_activeApp << std::endl;

   MyPointer myPointer(p_activeApp);
   std::cout << "Should be 0: " ;
   myPointer.printAddress();

   p_activeApp = new(bool);

   std::cout << "Should be anything: ";
   myPointer.printAddress();
}

void MyPointer::printAddress() {
   std::cout << this->m_activeApp << std::endl;
};

当然不行,因为m_activeApp仍然指向NULL,但是我该如何改变呢?

【问题讨论】:

  • 一方面,你的问题的措辞不清楚:你的意思是指针的地址(指针对象在内存中的位置)还是指针持有的地址(位置指针指向)?顺便说一句:关于minimal reproducible example,您甚至还没有接近,因为代码远非可编译。作为新用户,也请带上tour阅读How to Ask
  • 为什么分配给不同的变量时成员的值会发生变化? (了解指针最重要的一点是,指针没有什么特别之处。)
  • 您似乎期望p_activeApp 的更改也会对m_activeApp 产生影响,但事实并非如此。它们是两个不同的值。

标签: c++ pointers


【解决方案1】:

如果你想改变myPointer.m_activeApp 指向的东西,你必须将指针设置为不同的值,就这么简单。这个指针和p_activeApp 是两个截然不同的独立指针。改变一个不会改变另一个。

您可以做的是让一个指针成为对另一个指针的引用。那么,改变一个也会改变另一个。这会起作用,但要注意,这不是好的编程风格。

【讨论】:

  • 这不会是一种好的编程风格我会说它更像是一种“非常非常糟糕的编程风格”,有一个类成员变量作为参考到一些外部参数,因为它几乎肯定会导致类似于stackoverflow.com/questions/9941502/… 的未定义行为
  • 真的,@AndrewHenle。但是,这是一个有意义的示例:en.cppreference.com/w/cpp/thread/lock_guard。简而言之,我建议学习它并学习何时不使用它。
  • ``` MyPointer(const void* activeApp) : m_activeApp(&activeApp) ``` 像这样?
  • 如果指针被存储,这似乎只返回地址
  • 没有。请再次阅读您的 C++ 教程中有关参考的部分。然后,尝试使用int 和对它的引用来实现类似的目标。如果您可以使用,请将int 替换为void* 以使其与指针一起使用。我建议这两个步骤,因为 &amp;* 的语法对于初学者来说会很混乱。
【解决方案2】:

指针是整数(表示内存位置),因此将 void* 想象为一个数字。你将 p_activeApp 设置为 0,然后构造一个 MyPointer,并将其内部指针设置为 0。

然后您使用 new 运算符更改第一个数字,p_activeApp 现在得到一个值(到那个新的内存地址),但是 m_activeApp 没有理由也更改。无论 p_activeApp 更改为什么,它仍然指向 0。

【讨论】:

    【解决方案3】:

    我是这样解决的:

    public:
        MyPointer(void** activeApp) : m_pp_activeApp(activeApp) {
            std::cout <<"address on construction: " << *m_pp_activeApp << std::endl;
        };
    
    
        void printAddress();
    private:
        void** m_pp_activeApp;
    };
    
    int main(void){
        void* p_activeApp = nullptr;
        void** pp_activeApp = &p_activeApp;
    
        MyPointer myPointer(pp_activeApp);
    
        std::cout << "Should be 0: " ;
        myPointer.printAddress();
    
        p_activeApp = new(bool);
    
        std::cout << "Should be anything: ";
        myPointer.printAddress();
    
    }
    
    void MyPointer::printAddress() {
        std::cout << *m_pp_activeApp << std::endl;
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2013-03-07
      • 2013-07-12
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多