通过指针传递

Aan*_*Aan 13 c++ pointers

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

void Swap_byPointer1(int *x, int *y){
    int *temp=new int;
    temp=x;
    x=y;
    y=temp;
}
Run Code Online (Sandbox Code Playgroud)
void Swap_byPointer2(int *x, int *y){
    int *temp=new int;
    *temp=*x;
    *x=*y;
    *y=*temp;
}
Run Code Online (Sandbox Code Playgroud)

为什么Swap_byPointer2成功地在x和y之间交换,而Swap_byPointer1不是?

Ton*_*ion 7

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

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

像这样

void Swap_byPointer1(int **x, int **y){
    int *temp;
    temp=*x;
    *x=*y;
    *y=*temp;
}
Run Code Online (Sandbox Code Playgroud)

  • 此外,两者都有内存泄漏 (10认同)

COD*_*BOY 7

函数的初始设置(两者都相同)(模拟值)

(假设:在方框外面写的值是地址.)

在此输入图像描述

函数swap_byPointer1,

在此输入图像描述

函数swapby_Pointer2,

在此输入图像描述

希望这有助于了解发生的事情,干杯!


Dav*_*nan 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);
Run Code Online (Sandbox Code Playgroud)

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


Unc*_*ens 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
}
Run Code Online (Sandbox Code Playgroud)

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

在没有内存泄漏的情况下重写:

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
}
Run Code Online (Sandbox Code Playgroud)

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

  • 一个注意事项,因为OP可能并不明显.`x`和`y`是函数的局部函数,`x`和`y`的任何变化都纯粹包含在函数中,不会影响外部世界.这是第一个函数中发生的情况.另一方面,第二个函数改变了`x`和`y`*指向*,这确实影响了外部世界. (2认同)