使用指针交换变量。有什么不同? (C 编程)
Swapping the variables using pointers. What is the difference? (C Programming)
这两个函数有什么区别?你能通过一个例子来证明这一点吗?提前谢谢你。
一个是使用变量交换变量,另一个是用指针做同样的事情。有人告诉我其中一个是错误的,但是是哪一个以及为什么?
void swap1(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
void swap2(int *p1, int *p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
跟指针的概念有关。考虑下面的程序(只是添加了一些信息代码):
#include <stdio.h>
void swap1(int x, int y) {
printf("swap1 : xaddr = %p yaddr = %p\n", &x, &y);
printf("swap1: %d %d\n", x, y);
int temp;
temp = x;
x = y;
y = temp;
printf("swap1: %d %d\n", x, y);
}
void swap2(int *p1, int *p2) {
printf("swap2 : xaddr = %p yaddr = %p\n", p1, p2);
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int x = 10, y = 20;
printf("main: xaddr = %p yaddr = %p\n", &x, &y);
swap1(x, y);
printf("main after swap1 : %d %d\n", x, y);
swap2(&x, &y);
printf("main after swap2: %d %d\n", x, y);
return 0;
}
main 中的变量 x
和 y
驻留在 main()
的局部函数堆栈中,当 swap1
被调用时只是值的副本传递的不是 x
和 y
所在的实际地址。因此,交换操作仅发生在 swap1
的局部值之间。而在 swap2
的情况下,传递的是实际地址。因此,您对该地址执行的任何操作也会反映在 main()
中。
输出:
main: xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
swap1 : xaddr = 0x7ffda2efc02c yaddr = 0x7ffda2efc028
swap1: 10 20
swap1: 20 10
main after swap1 : 10 20
swap2 : xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
main after swap2: 20 10
从输出结果可以看出,main
中x
和y
的地址与swap1
中的地址不同,确实发生了swap操作在 swap1
中,但它仅在 swap1
中。而在 swap2
中,我们在同一地址上操作,main
将其视为 x
和 y
,因此操作是永久性的。
这两个函数有什么区别?你能通过一个例子来证明这一点吗?提前谢谢你。
一个是使用变量交换变量,另一个是用指针做同样的事情。有人告诉我其中一个是错误的,但是是哪一个以及为什么?
void swap1(int x, int y) {
int temp;
temp = x;
x = y;
y = temp;
}
void swap2(int *p1, int *p2) {
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
跟指针的概念有关。考虑下面的程序(只是添加了一些信息代码):
#include <stdio.h>
void swap1(int x, int y) {
printf("swap1 : xaddr = %p yaddr = %p\n", &x, &y);
printf("swap1: %d %d\n", x, y);
int temp;
temp = x;
x = y;
y = temp;
printf("swap1: %d %d\n", x, y);
}
void swap2(int *p1, int *p2) {
printf("swap2 : xaddr = %p yaddr = %p\n", p1, p2);
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int x = 10, y = 20;
printf("main: xaddr = %p yaddr = %p\n", &x, &y);
swap1(x, y);
printf("main after swap1 : %d %d\n", x, y);
swap2(&x, &y);
printf("main after swap2: %d %d\n", x, y);
return 0;
}
main 中的变量 x
和 y
驻留在 main()
的局部函数堆栈中,当 swap1
被调用时只是值的副本传递的不是 x
和 y
所在的实际地址。因此,交换操作仅发生在 swap1
的局部值之间。而在 swap2
的情况下,传递的是实际地址。因此,您对该地址执行的任何操作也会反映在 main()
中。
输出:
main: xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
swap1 : xaddr = 0x7ffda2efc02c yaddr = 0x7ffda2efc028
swap1: 10 20
swap1: 20 10
main after swap1 : 10 20
swap2 : xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
main after swap2: 20 10
从输出结果可以看出,main
中x
和y
的地址与swap1
中的地址不同,确实发生了swap操作在 swap1
中,但它仅在 swap1
中。而在 swap2
中,我们在同一地址上操作,main
将其视为 x
和 y
,因此操作是永久性的。