C/C++中函數參數傳遞的三種情況(p *p &p)


 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的地址互換了。程序運行見下圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM