C ++如何正确复制指针的值

时间:2014-11-30 02:31:35

标签: c++ pointers

所以我有一些问题,需要帮助解决这个初学者的问题。

我改变了我的榜样,这样才有意义。在睡眠不足的情况下,我不应该张贴一个。

我试图复制指针(让我们称之为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
*/

对此事的任何启示都将不胜感激。

5 个答案:

答案 0 :(得分:2)

我认为你对正在发生的事情有误解。声明*p1 = num2;并未更改p1的值,而是将p1 的值更改为。由于当您通过一个指针更改其值时,p1p2都指向同一个变量,因此当您取消引用任一指针时,您将看到相同的值。您要做的是p1指向num2,而不是num2的值,并将其存储在p1个点中。

更改

*p1 = num2;

p1 = &num2;

答案 1 :(得分:1)

你的第一个代码毫无意义。如果testObj不是指针的typedef,则为 第一个p1赋值中的*是错误的(它应该是&),第二个p1赋值也是错误的,因为你不能将一个临时对象赋给一个指针,(只有地址为变量或来自新的) 并始终记得在使用*p

之前为指针p分配地址

如果要复制指针,副本将指向与原始指针相同的内容,p2 = p1;是正确的。如果要复制对象,则指针事物与它无关,应如何在复制构造函数和operator =中定义复制对象的方式。 根据类别,memcpy可以工作与否,在这种情况下不要依赖它。

答案 2 :(得分:1)

无意义的代码

  

当p1改变它指向的对象时,我不希望p2随之改变

如果p1p2指向同一个对象,则更改对象p1指向将更改(相同)对象p2指向,期间。您必须使用与原始指针不同的机制来避免该行为。就像制作指向对象的副本而不是复制指针一样。

另外

  

我必须使用memcpy吗?或者还有另一种方式吗?

由于这是C ++,我会避免使用memcpy

定义copy constructorassignment 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”。所以你需要从

更改decl
obj * p1, p2;

obj *p1, *p2;