1 #include <stdio.h> 2 void swap(int a,int b){ 3 int temp=a; 4 a=b; 5 b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 swap(a,b); 10 printf("%d %d",a,b); 11 return 0; 12 }
方法一:
以上這種做法不能交換兩個數。
這是因為函數在接受參數的過程中是單向一次性的值傳遞,即在調用swap(a,b)的時候將a b的值傳進去了,相當於傳進去一個副本,對副本進行操作不會影響main函數中的a b的值。
1 #include <stdio.h> 2 void swap(int* a,int* b){ 3 int temp=*a; 4 *a=*b; 5 *b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a;//指針不初始化很危險 10 int* p2=&b; 11 swap(p1,p2); 12 printf("%d %d\n",a,b); 13 printf("%d %d\n",*p1,*p2); 14 return 0; 15 }
方法二:
以上這種做法能交換兩個數。
因為指針變量存放的是地址,那么使用指針變量作為參數時傳進來的也是地址。在上式中,把&a和&b 作為參數傳遞進去,在swap函數中指針a存放&a,指針b存放&b,實現了直接對地址中存放的數據進行操作,因此交換操作會改變main函數中a與b的值。
只有在獲取地址的情況下對地址指向的數據進行操作,才能真正地修改變量。
1 #include <stdio.h> 2 void swap(int* a,int* b){ 3 int *temp=a; 4 a=b; 5 b=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a; 10 int* p2=&b; 11 printf("%d %d\n",*p1,*p2); 12 printf("%d %d\n",&a,&b); 13 swap(p1,p2); 14 printf("%d %d\n",*p1,*p2); 15 printf("%d %d\n",&a,&b); 16 return 0; 17 }
方法三:
以上這種做法不能交換兩個數。
因為這種做法本質上和方法一一樣,swap函數交換完地址之后main函數里的a和b的地址其實沒有被交換。其實,main函數傳給swap函數的“地址”是一個“無符號整數”,其本身也跟普通變量一樣只是值傳遞。
1 #include <stdio.h> 2 void swap(int &x,int &y){ 3 int temp=x; 4 x=y; 5 y=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 printf("%d %d\n",a,b); 10 swap(a,b); 11 printf("%d %d\n",a,b); 12 return 0; 13 }
方法四:
以上這種方法能交換兩個數。
使用C++中的“引用”,可以不產生副本,而是給原來的變量起一個別名。對引用變量的操作就是對原變量的操作,可以達到在函數中修改函數外部變量的效果。即在上式中x=a y=b,所以對x y進行修改其實也是對a b進行修改。
1 #include <stdio.h> 2 void swap(int* &x,int* &y){ 3 int* temp=x; 4 x=y; 5 y=temp; 6 } 7 int main(){ 8 int a=1,b=2; 9 int* p1=&a; 10 int* p2=&b; 11 printf("%d %d\n",*p1,*p2); 12 printf("%d %d\n",&a,&b); 13 swap(p1,p2); 14 printf("%d %d\n",*p1,*p2); 15 printf("%d %d\n",&b,&a); 16 return 0; 17 }
方法五:
以上這種做法能交換兩個數。
因為對指針進行了引用,所以改變指針x y 就是改變指針p1 p2,即main函數中a b的地址互換了。程序運行見下圖。