通过指针传递

时间:2011-11-22 16:30:22

标签: c++ pointers

我对这两个功能感到困惑:

void Swap_byPointer1(int *x, int *y){
    int *temp=new int;
    temp=x;
    x=y;
    y=temp;
}

void Swap_byPointer2(int *x, int *y){
    int *temp=new int;
    *temp=*x;
    *x=*y;
    *y=*temp;
}

为什么Swap_byPointer2成功在x和y之间切换,Swap_byPointer1不成功?

4 个答案:

答案 0 :(得分:7)

在你的第一个函数中,你自己交换指针,然后在第二个函数中交换指针指向的值,即指针解除引用。

如果要更改指针指向的内容,则应该将指针传递给指针(即int**x)并更改第二个指针。

喜欢这样

void Swap_byPointer1(int **x, int **y){
    int *temp;
    temp=*x;
    *x=*y;
    *y=*temp;
}

答案 1 :(得分:6)

因为参数是按值传递的。在第一个代码示例中,您所做的只是交换指针的本地副本。第二个例子实际上写给了指责者。

更好的方法是使用传递引用并通过使用堆栈分配的temp int来避免堆分配。

void SwapByRef(int &x, int &y)
{
    int temp=x;     
    x=y;     
    y=temp;
}
....
int x=1;
int y=2;
SwapByRef(x, y);

正如其他人所指出的那样,两个代码示例都会泄漏内存,因为永远不会删除temp。对于像这样的简单int,只需为您的temp使用堆栈分配的local int变量。

答案 2 :(得分:5)

第一个代码段交换作为指针值的内存地址。由于指针是本地副本,因此对调用者没有任何影响。

重写没有内存泄漏:

void Swap_byPointer1(int *x, int *y){
    //e.g x = 0xDEADBEEF and y = 0xCAFEBABE;
    int *temp=x;
    x=y;
    y=temp;
    //now x = 0xCAFEBABE and y = 0xDEADBEEF
}

第二个交换指针(指针指向的对象)。

重写没有内存泄漏:

void Swap_byPointer2(int *x, int *y){
    //e.g *x = 100 and *y = 200
    int temp =*x;
    *x=*y;
    *y=temp;
    //now *x = 200 and *y = 100
    //there are now different values at the original memory locations
}

(指针指向动态分配的对象,但不必指向。使用指针并不意味着必须有 new - 分配。指针可以指向具有自动生命周期的对象好。)

答案 3 :(得分:4)

第一个函数只是重新分配指针的本地副本,而不是修改基础值。当它返回时,它将没有任何效果(除了分配一个新的int)

相关问题