首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >复制指针,更改副本指向的内容而不更改原件?

复制指针,更改副本指向的内容而不更改原件?
EN

Stack Overflow用户
提问于 2019-04-07 15:13:49
回答 1查看 2.8K关注 0票数 1

是否可以复制指针,然后更改它所指向的值而不更改原始指针所指向的值?

例如,假设我有以下内容:

代码语言:javascript
代码运行次数:0
运行
复制
int *i;
auto j = i;

*j = new_val;

这将改变存储在i所指向的地址上的值,因为ij都指向相同的内存地址,我不想这样做。

因为这个例子非常简单,所以我只需创建一个新的int *j,而不需要在i上进行复制。但是在更复杂的情况下,例如链接列表,我不想重新创建链接列表。

因此,我想我的问题归结为是否有可能复制一个指针,并让复制指向一个不同的地址,但保持原指针的结构完整性?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-07 15:37:53

首先要澄清一下。指针是一个独立的变量,它保存一个内存地址。没有更多,没有更少。poitner的类型意味着程序员告诉编译器在该地址存储了什么,这样您就可以检索存储在该地址上的值--这称为去引用。

现在,考虑到这一点,您应该能够自己想要做什么,但让我们完成这个过程,我们将使用智能指针,因为它们帮助我们管理内存:

代码语言:javascript
代码运行次数:0
运行
复制
std::unique_ptr<int> i = std::make_unique<int>(10); 
//Here we created a variable on the heap and gave it a value 10,
//the address of it is stored in **i**

std::unique_ptr<int> j = std::make_unique<int>(*i);
//Here we created a variable on the heap nad gave it a value
//stored at the address in **i**. Notice the dereferencing
//that means we want to copy the value pointed to,
//not the pointer itself.

现在,如果没有智能指针,这对您来说更有意义:

代码语言:javascript
代码运行次数:0
运行
复制
int *i = new int(10);
int *j = new int(*i);
delete i;
delete j;

这做了同样的事情,但是您需要自己管理内存,例如,当抛出异常时,内存就会泄漏。

现在,这将适用于所有类型,这些类型要么像示例中的int那样简单,要么定义了复制构造函数。编译器通常会自动为您的类型生成一个,除非它由于某种原因不能这样做,在这种情况下,您必须自己提供它:

有关更多细节,请参见这里:复制构造函数

编辑:对指针的一些非常好的解释,包括演示如何做您想做的事情:C++指针( TheCherno )

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55560485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档