如何使用指針交換兩個數的值,深入理解指針


 

使用外部函數交換兩個變量的值,一個再簡單不過的事情,但是在C/C++中,正確實現該功能反應了你對指針和引用等重要知識的掌握程度。本文列舉了幾種常見的寫法,其中前三種是錯誤的,后兩種是正確的。第四種使用的是指針,第五種使用的是引用。請看下面五個簡單的函數:

 

[cpp]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. #include<iostream>  
  2.  using namespace std;  
  3. int fun1 (int a,int b)  
  4. {  
  5.     int c;  
  6.     c=a;a=b;b=c;  
  7.     cout<<"a1:"<<a<<";b1:"<<b<<endl;  
  8. }     
  9. int fun2 (int *a,int *b)  
  10. {  
  11.     int *c;  
  12.     c=a;a=b;b=c;  
  13.     cout<<"a2:"<<*a<<";b2:"<<*b<<endl;  
  14. }  
  15. int fun3(int *a,int *b)  
  16. {  
  17.     int *c;  
  18.      c=*a;*a=*b;*b=c;  
  19.     cout<<"a3:"<<*a<<";b3:"<<*b<<endl;  
  20. }  
  21. int fun4 (int *a,int *b)  
  22. {  
  23.     int c;  
  24.     c=*a;*a=*b;*b=c;  
  25.     cout<<"a4:"<<*a<<";b4:"<<*b<<endl;  
  26. }  
  27.   
  28. int fun5 (int &a,int &b)  
  29. {  
  30.     int c;  
  31.     c=a;a=b;b=c;  
  32.     cout<<"a5:"<<a<<";b5:"<<b<<endl;  
  33. }     
  34. int  main()  
  35.     {  
  36.   
  37.     int aa=1,bb=2;  
  38.     fun1(aa,bb);  
  39.     cout<<"aa1:"<<aa<<";bb1:"<<bb<<endl;  
  40.     fun2(&aa,&bb);  
  41.     cout<<"aa2:"<<aa<<";bb2:"<<bb<<endl;  
  42.     fun3(&aa,&bb);  
  43.     cout<<"aa3:"<<aa<<";bb3:"<<bb<<endl;  
  44.     fun4(&aa,&bb);  
  45.     cout<<"aa4:"<<aa<<";bb4:"<<bb<<endl;  
  46.       
  47.     aa=1,bb=2;  
  48.     fun5(aa,bb);  
  49.     cout<<"aa5:"<<aa<<";bb5:"<<bb<<endl;  
  50.     return 0;  
  51.       
  52.    } 

輸出結果為:

 

[cpp]  view plain copy
 print?在CODE上查看代碼片派生到我的代碼片
  1. a1:2;b1:1  
  2. aa1:1;bb1:2  
  3. a2:2;b2:1  
  4. aa2:1;bb2:2  
  5. aa3:1;bb3:2  
  6. a4:2;b4:1  
  7. aa4:2;bb4:1  
  8. a5:2;b5:1  
  9. aa5:2;bb5:1  

 

fun1(),如果使用Java或者其它高級語言,使用該函數沒什么問題,甚至是天經地義的,但是C和C++里卻不行,原因是main中調用fun1()時,將實參a,b的值傳遞給了交換函數,如果此時在swap1中打印,可以看到結果是正確的,但是該過程其實是將aa和bb分別復制了一份給了函數,執行完fun1()之后,aa和bb的值沒有任何變化。

 

fun2(),看似的確使用了指針,但任然失敗,為什么呢?其實這里是將aa和bb的地址給交換了,而並沒有交換aa和bb的值。在這里由於未給c賦值,c中並沒有確定的值,c中的值是不可預見的。此時c可能指向一個未知的存儲單元。而嚴重的情況是,該單元的數據可能是有用的,因此fun2()不但沒有實現兩個數的交換,反而給系統的穩定性帶來威脅。

fun3(),將int賦值給int *,編譯錯誤。c是int *類型,*a、*b、*c是int類型

fun4()是正確的。為了在函數中改變了的變量能被其它函數調用,正確的辦法是用指針變量作為函數參數,在函數執行過程中使指針變量所指向的變量值發生變化,函數調用結束后,哲別變量值的變化依然保留下來,這樣就實現了通過函數調用是變量的值發生變化,在其它函數中可以使用這些改變了的值的目的。

fun5()也是正確的,這是引用的重要應用之一。對於引用的操作實際上是作用在引用所因的對象上。


免責聲明!

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



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