是否可以复制一个指针,然后在不更改原始指针指向什么的情况下更改其指向的值?
例如,说我有以下内容:
int *i;
auto j = i;
*j = new_val;
这将更改存储在地址i
所指向的值,因为i
和j
都指向相同的内存地址,这是我不需要的。
由于此示例案例非常简单,因此我只需创建一个新的int *j
而无需复制i
。但是在更复杂的情况下,例如链表,我不想重新创建链表。
所以我想我的问题归结为是否有可能复制指针,并将复制点指向其他地址,但保持原始指针的结构完整性吗?
答案 0 :(得分:2)
首先要澄清一下。指针是一个独立的变量,其中包含一个内存地址。仅此而已。 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
这样琐碎的所有类型,或者定义了复制构造函数的所有类型。编译器通常会自动为您的类型生成一个,除非由于某种原因它不能这样做,在这种情况下,您必须自己提供它:
有关更多详细信息,请参见此处:Copy Constructors
编辑:指针的一些很好的解释,包括演示如何做自己想做的事情:C++ Pointers by TheCherno