多个指针指向同一个地址

本文探讨了多个指针指向同一内存地址时的操作注意事项。重点解释了指针赋值NULL仅改变该指针本身,不影响其他指向同一地址的指针。通过示例代码展示了delete操作符的使用及对指针的影响。
  • 多个指针指向同一个地址,这样使用没什么问题,只是操作时要注意。
  • 因为,每个指针变量保存的值,仅仅是指向的内容的地址值。多个指向同一个地址的指针,若其中一个指针等于NULL,不影响另一个指针。
  • 代码
int* a = new int(10);
int* c = a;

delete c; // 指向的那块内存内容(new int(10)释放 
c = NULL // 仅让c的值变为 null, a的值(地址)未变

if (a != NULL) {
    // 此处代码仍会函数体仍会执行!!!
}
### 让两个指针指向同一地址 在 C/C++ 中,可以通过简单的赋值操作使两个指针变量指向相同的内存地址。例如: ```cpp int* p1 = new int(10); int* p2 = p1; // p2 与 p1 指向同一内存地址 ``` 上述代码中,`p2 = p1` 将 `p1` 的地址赋值给 `p2`,使得两个指针指向相同的内存空间[^1]。 --- ### 地址一致性与独立性 虽然 `p1` 和 `p2` 指向相同的内存地址,但它们是两个独立的指针变量,其自身的地址不同。例如: ```cpp std::cout << "p1 的地址:" << &p1 << std::endl; std::cout << "p2 的地址:" << &p2 << std::endl; ``` 输出结果表明 `p1` 和 `p2` 是两个不同的变量,只是它们的值(即所指向地址)相同[^2]。 如果后续修改了 `p1` 的指向,`p2` 的地址不会随之改变: ```cpp p1 = new int(20); // p1 现在指向新的内存地址 std::cout << *p2 << std::endl; // 输出 10,p2 仍然指向原始地址 ``` 这说明指针赋值是浅拷贝行为,仅复制地址值,而非动态绑定关系[^1]。 --- ### 内存管理注意事项 多个指针指向同一块内存时,必须谨慎处理资源释放问题。若对其中一个指针调用 `delete` 或 `free`,则其余指针将变为“野指针”,访问这些指针会导致未定义行为: ```cpp delete p1; std::cout << *p2 << std::endl; // 错误:p2 已经失效 ``` 因此,在释放内存后,建议将所有相关指针设为 `nullptr`,以避免误操作: ```cpp p1 = nullptr; p2 = nullptr; ``` 此外,C++ 标准支持上下文转换为布尔类型,判断指针是否为空时可直接使用 `if (p)` 而无需 `if (p == NULL)`,后者在现代 C++ 中已不再推荐[^4]。 --- ### 实践示例 以下是一个完整的实践示例,展示如何让两个指针指向同一内存,并正确释放资源: ```cpp #include <iostream> int main() { int* p1 = new int(5); int* p2 = p1; std::cout << "p1 指向的值:" << *p1 << std::endl; std::cout << "p2 指向的值:" << *p2 << std::endl; delete p1; p1 = nullptr; p2 = nullptr; return 0; } ``` --- ###
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值