我对这两个功能感到困惑:
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
不成功?
答案 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)