指针直接赋值与解引用赋值的区别解析
Case1 和 Case2 操作的核心差异分析
先明确初始状态:
first指向一个独立的node对象(data=5,r和l为NULL)prev指向另一个独立的node对象(data=10,r和l为NULL)
Case1: first = prev;
这是指针变量的赋值操作:
- 直接将
prev中存储的内存地址,复制给first变量 - 操作完成后,
first和prev将指向同一块内存区域(也就是原来prev指向的data=10的node对象) - 原来
first指向的data=5的node对象,因为没有任何指针再引用它,会成为内存泄漏(除非后续有其他指针重新指向它) - 后续对
first的指针操作(比如first->data = 20),会直接修改prev指向的对象内容,两者完全绑定
Case2: *first = *prev;
这是对象内容的拷贝赋值操作:
- 把
prev指向的对象的所有成员变量值,逐个复制到first指向的对象中 - 操作完成后,
first仍然指向原来的内存地址(data=5的node对象),但它的成员会被覆盖:first->data变为10,first->r和first->l变为NULL(和prev指向的对象状态完全一致) - 原来的两个
node对象都依然存在,各自有独立的内存地址,不会出现内存泄漏 - 后续修改
first指向的对象内容,不会影响prev指向的对象,反之亦然,两者是完全独立的两个实例
一句话总结
- Case1是让两个指针"共享同一个对象",抛弃原来的对象;Case2是让两个指针各自指向的对象"内容同步",对象本身还是独立的
内容的提问来源于stack exchange,提问作者Akshat Shahjade
相关产品推荐
相关产品推荐

