这两种指针方法的区别

时间:2014-02-10 02:13:44

标签: c pointers

Decode1:

void decode1(int *xp, int *yp, int *zp){
 int x = *xp;
 int y = *yp; 
 int z = *zp;
 xp = &z;
 yp = &x;
 zp = &y;
}

Decode2:

 void decode2(int *xp, int *yp, int *zp){
 int x = *xp;
 int y = *yp; 
 int z = *zp;
 *xp = z;
 *yp = x;
 *zp = y;
}

Decode1会将指针更改为z,x和y的地址。 Decode2将改为改变指针地址的值。这两种方法可以互换吗?是否存在一个比另一个更正确的情况?

3 个答案:

答案 0 :(得分:4)

Decode2是正确的程序。在Decode1中,在调用堆栈结束后,您在xp,yp,zp中分配的地址将消失。

答案 1 :(得分:3)

不,它们不可互换,也不会做同样的事情。

decode1将无效,decode2将起作用(假设您要交换变量)。

decode1函数在函数执行时将xyz放在堆栈上,这些变量仅存在。它返回这些变量的那一刻不再指向有效的内存。此外,指针xpypzp是传递给函数的指针的副本,因此您不会修改原始指针(因此在函数中更改它们)绝对没有。)

decode2功能将按预期工作。

答案 2 :(得分:2)

decode1尝试返回指向局部变量的指针但最终什么都不做。使用decode2