C 这两种指针方法之间的区别

C 这两种指针方法之间的区别,c,pointers,C,Pointers,解码1: void decode1(int *xp, int *yp, int *zp){ int x = *xp; int y = *yp; int z = *zp; xp = &z; yp = &x; zp = &y; } 解码2: void decode2(int *xp, int *yp, int *zp){ int x = *xp; int y = *yp; int z = *zp; *xp = z; *yp = x; *zp =

解码1:

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

 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将更改指针地址处的值。这两种方法可以互换吗?是否存在一种情况比另一种更正确

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

不,它们不可互换,也不做相同的事情

假设您想交换变量,decode1将不起作用,decode2将起作用

decode1函数将x、y和z放在堆栈上,这些变量仅在函数执行时存在。当它返回这些变量时,这些变量不再指向有效内存。此外,指针xp、yp和zp是传递给函数的指针的副本,因此您不会修改原始指针,因此在函数中更改它们绝对没有任何作用


decode2功能将按预期工作。

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

Decode1在返回后不做任何操作。重新分配变量xp=&z与更改*xp=z指向的数据不同。假设您在一张纸上写下女友的地址。方法1对应于某人复制了那张纸,但立即丢失了副本。方法2对应于某人前往纸片上的地址并重新安装其桌面操作系统。他们不是一回事。