我对这两个功能感到困惑:
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不是?
在你的第一个函数中,你自己交换指针,在第二个函数中你交换指针所指向的值,即指针被解除引用.
如果要更改指针指向的内容,则应该将指针传递给指针(即int**x)并更改第二个指针.
像这样
void Swap_byPointer1(int **x, int **y){
int *temp;
temp=*x;
*x=*y;
*y=*temp;
}
Run Code Online (Sandbox Code Playgroud)
函数的初始设置(两者都相同)(模拟值)
(假设:在方框外面写的值是地址.)

函数swap_byPointer1,

函数swapby_Pointer2,
希望这有助于了解发生的事情,干杯!
因为参数是按值传递的.在第一个代码示例中,您所做的只是交换指针的本地副本.第二个例子实际上写给了指责者.
更好的方法是使用传递引用并通过使用堆栈分配的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变量.
第一个片段交换作为指针值的内存地址.由于指针是本地副本,因此对调用者没有任何影响.
在没有内存泄漏的情况下重写:
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)
(指针可以指向动态分配的对象,但不必指向.使用指针并不意味着必须有新的分配.指针也可以指向具有自动生命周期的对象.)