为什么这些交换函数的行为不同?

#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具有函数参数的值语义 。 这意味着所有三个交换变量的ab都是各个函数的局部变量 。 它们是您作为参数传递的值的副本 。 换一种说法:

  • swap1交换两个局部整数变量的值 – 在函数外没有可见的效果
  • swap2交换两个局部变量的值,在这种情况下是指针, – 相同,没有可见效果
  • swap3最终得到它并交换本地指针变量指向的值。

你的swap2function没有效果。

你传递了两个指针。 在函数内部,(参数)变量ab是函数的局部变量。 swap2函数只是交换这些局部变量的值 – 在函数本身之外没有任何影响。

正如Anon所指出的, swap1有同样的问题 – 你只是修改局部变量。

swap1将无法工作,因为该函数只是复制了参数,而不影响main的变量。

swap2也不起作用。

swap1()swap2()的效果仅限于函数本身的范围:它们交换的变量是由副本传递的参数,应用于它们的任何更改都不会影响main()中复制的源变量函数调用。

swap3作用于参数指向的值,而不是作用于参数本身。 它是三个中唯一一个用于存储main()ab变量的内存地址的值。

只是为了好玩,在不使用临时变量的情况下交换值

 x = x ^ y y = x ^ y x = x ^ y