我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?

Posted

技术标签:

【中文标题】我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?【英文标题】:I assigned a variable to the value of what is stored at a pointer's address, so why doesn't it change when the initial value does?我为存储在指针地址中的值分配了一个变量,那么为什么当初始值改变时它不改变呢? 【发布时间】:2021-03-04 17:23:41 【问题描述】:

基本上,我只想知道为什么“A”发生变化时“C”不变。我猜这是因为层次结构,但我想确认并解释为什么......

#include <iostream>
using namespace std;

class IntCell

public:
  explicit IntCell( int initialValue = 0 )
   storedValue = new int initialValue ; 
  
  int read() const
   return *storedValue; 
  
  void write( int x )
   *storedValue = x; 
  
private:
  int *storedValue;
;

int main() 
  IntCell a 2 ;
  IntCell* b = &a;
  IntCell c;
  
  int x = 10000;
  int* y = &x;
  
  cout << *y << endl;
  
  c = *b;
  
  a.write(4);
  cout << a.read() << endl << c.read();
  return 0;


【问题讨论】:

你得到了什么输出,预期的输出是什么?我收到10000 4 4,这是意料之中的,但我不确定我是否理解您的问题。 @DavidSchwartz storedValue 对于两个实例都是相同的。因此a.write(4); 会影响c.read() 的结果。我认为这就是 OP 的意思。 【参考方案1】:

我测试你的代码,当你改变“a”时,“c”也会改变。 你还需要实现一个复制构造函数和赋值运算符。

IntCell c; // you create a new instance with new memory address.

c = *b; // now this instance point to same memory as "a".

a.write(4); // so when you change "a", "c" change too.

【讨论】:

所以我对整个编程真的很陌生。你做了什么来得到这个故障/你使用什么 IDE?【参考方案2】:

    在你的情况下,析构函数丢失了。

     ~IntCell()
      cout<<"deleting...\n";
      delete storedValue;
    
    

    您正在使用隐式定义的复制分配。这就是c = *b; 起作用的原因。复制分配后,IntCell cIntCell a 都有指向同一位置的成员。如果a.write(4)c.read() 将得到相同的值4

【讨论】:

以上是关于我为存储在指针地址中的值分配了一个变量,那么为啥当初始值改变时它不改变呢?的主要内容,如果未能解决你的问题,请参考以下文章

指针定义NULL后无法赋值?

指针本质分析

C语言free释放内存后为啥指针里的值不变?竟然还可以输出

有关C++指针与安全阐述

C语言指针总结

C++中内存分配问题