为什么这些交换函数的行为不同?
#include void swap1(int a, int b) { int temp = a; a = b; b = temp; } void swap2(int *a, int *b) { int *temp = a; a = b; b = temp; } void swap3(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } main() { int a = 9, b = 4; printf("%d , %d\n", a, b); swap1(a, b); printf("%d , %d\n", a, b); swap2(&a, &b); printf("%d , %d\n", a, b); swap3(&a, &b); printf("%d , %d\n", a, b); }
C具有函数参数的值语义 。 这意味着所有三个交换变量的a
和b
都是各个函数的局部变量 。 它们是您作为参数传递的值的副本 。 换一种说法:
-
swap1
交换两个局部整数变量的值 – 在函数外没有可见的效果 -
swap2
交换两个局部变量的值,在这种情况下是指针, – 相同,没有可见效果 -
swap3
最终得到它并交换本地指针变量指向的值。
你的swap2
function没有效果。
你传递了两个指针。 在函数内部,(参数)变量a
和b
是函数的局部变量。 swap2
函数只是交换这些局部变量的值 – 在函数本身之外没有任何影响。
正如Anon所指出的, swap1
有同样的问题 – 你只是修改局部变量。
swap1
将无法工作,因为该函数只是复制了参数,而不影响main
的变量。
swap2
也不起作用。
swap1()
和swap2()
的效果仅限于函数本身的范围:它们交换的变量是由副本传递的参数,应用于它们的任何更改都不会影响main()
中复制的源变量函数调用。
swap3
作用于参数指向的值,而不是作用于参数本身。 它是三个中唯一一个用于存储main()
的a
和b
变量的内存地址的值。
只是为了好玩,在不使用临时变量的情况下交换值
x = x ^ y y = x ^ y x = x ^ y