所以我有一些问题,需要帮助解决这个初学者的问题。
我改变了我的榜样,这样才有意义。在睡眠不足的情况下,我不应该张贴一个。
我试图复制指针(让我们称之为p1)以创建第二个指针(让我们称之为p2)。
当p1改变它指向的对象时,我不希望p2随之改变,这似乎是我的程序中发生的事情。
基本上,这是我有......的问题。
#include <string>
#include <iostream>
int main(){
std::cout << "Pointer Test\n\n";
int num1, num2;
int * p1, * p2;
num1 = 5;
num2 = 10;
p1 = &num1;
p2 = p1;
std::cout << "P1 is pointing at value " << *p1 << " (should be 5)\n";
std::cout << "P2 is pointing at value " << *p2 << " (should be 5)\n\n";
*p1 = num2; //Even though the value of P1 is changing, I don't want the value of P2 to change. I want it to stay on num1
std::cout << "P1 is pointing at value " << *p1 << " (should be 10)\n";
std::cout << "P2 is pointing at value " << *p2 << " (I want this to be 5, not 10)\n";
return 0;
}
/*
Assignments I've tried to make this work...
p2 = p1; //didn't work - *p2 changes when *p1 does, which I am trying to avoid
*p2 = *p1; //didn't work - caused segfault
*p2 = p1; //didn't work - can't convert int to *int, so won't compile
p2 = &(*p1); //didn't work - gave same result as p2 = p1
*/
对此事的任何启示都将不胜感激。
答案 0 :(得分:2)
我认为你对正在发生的事情有误解。声明*p1 = num2;
并未更改p1
的值,而是将p1
点的值更改为。由于当您通过一个指针更改其值时,p1
和p2
都指向同一个变量,因此当您取消引用任一指针时,您将看到相同的值。您要做的是p1
指向num2
,而不是num2
的值,并将其存储在p1
个点中。
更改
*p1 = num2;
到
p1 = &num2;
答案 1 :(得分:1)
你的第一个代码毫无意义。如果testObj不是指针的typedef,则为
第一个p1赋值中的*
是错误的(它应该是&
),第二个p1赋值也是错误的,因为你不能将一个临时对象赋给一个指针,(只有地址为变量或来自新的)
并始终记得在使用*p
如果要复制指针,副本将指向与原始指针相同的内容,p2 = p1;
是正确的。如果要复制对象,则指针事物与它无关,应如何在复制构造函数和operator =中定义复制对象的方式。
根据类别,memcpy可以工作与否,在这种情况下不要依赖它。
答案 2 :(得分:1)
无意义的代码
当p1改变它指向的对象时,我不希望p2随之改变
如果p1
和p2
指向同一个对象,则更改对象p1
指向将更改(相同)对象p2
指向,期间。您必须使用与原始指针不同的机制来避免该行为。就像制作指向对象的副本而不是复制指针一样。
另外
我必须使用memcpy吗?或者还有另一种方式吗?
由于这是C ++,我会避免使用memcpy
。
定义copy constructor或assignment operator是复制对象的更好方法。
答案 3 :(得分:1)
请考虑以下代码:
int a = 5, b = 10, *foo, *bar;
foo = &a; // foo now points at the address of A
bar = foo; // bar now points at the address at which foo is pointing
foo = &b; // foo now points at the address of B
cout << *foo; // prints 10
cout << *bar; // prints 5
如果我没弄错的话,这就是你想要达到的行为。
但是你的代码是荒谬的。如果我没错,你的错误是你创建了第二个指针,它指向第一个指针的地址而不是指向第一个指针的地址。
答案 4 :(得分:0)
没有类似obj *
的类型。 “*”更紧密地绑定到“p1”。所以你需要从
obj * p1, p2;
要
obj *p1, *p2;