是否可以复制指针,然后更改它所指向的值而不更改原始指针所指向的值?
例如,假设我有以下内容:
int *i;
auto j = i;
*j = new_val;
这将改变存储在i
所指向的地址上的值,因为i
和j
都指向相同的内存地址,我不想这样做。
因为这个例子非常简单,所以我只需创建一个新的int *j
,而不需要在i
上进行复制。但是在更复杂的情况下,例如链接列表,我不想重新创建链接列表。
因此,我想我的问题归结为是否有可能复制一个指针,并让复制指向一个不同的地址,但保持原指针的结构完整性?
发布于 2019-04-07 07:37:53
首先要澄清一下。指针是一个独立的变量,它保存一个内存地址。没有更多,没有更少。poitner的类型意味着程序员告诉编译器在该地址存储了什么,这样您就可以检索存储在该地址上的值--这称为去引用。
现在,考虑到这一点,您应该能够自己想要做什么,但让我们完成这个过程,我们将使用智能指针,因为它们帮助我们管理内存:
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.
现在,如果没有智能指针,这对您来说更有意义:
int *i = new int(10);
int *j = new int(*i);
delete i;
delete j;
这做了同样的事情,但是您需要自己管理内存,例如,当抛出异常时,内存就会泄漏。
现在,这将适用于所有类型,这些类型要么像示例中的int
那样简单,要么定义了复制构造函数。编译器通常会自动为您的类型生成一个,除非它由于某种原因不能这样做,在这种情况下,您必须自己提供它:
有关更多细节,请参见这里:复制构造函数
编辑:对指针的一些非常好的解释,包括演示如何做您想做的事情:C++指针( TheCherno )
https://stackoverflow.com/questions/55560485
复制