C 學習筆記(二) 交換函式(swap)

2022-02-01 06:31:41 字數 1327 閱讀 4266

這次我們要透過乙個簡單的函式swap深入理解函式傳參的本質以及在c++中如何選擇傳參方式。

先來看第一段程式:

void swap(int x, int

y)

通過main函式的呼叫,我們發現x,y並未實現交換:

int

main()

原因是整形x和y在函式swap內為按值傳遞,按值傳遞時,函式不會訪問當前呼叫的實參。函式處理的值是它本地的拷貝,這些拷貝被儲存在執行棧中,因此改變這些值不會影響實參的值。一旦函式結束了,函式的活動記錄將從棧中彈出,這些區域性值也就消失了。

在按值傳遞的情況下,實參的內容沒有被改變。這意味著程式設計師在函式呼叫時無需儲存和恢復實參的值。如果沒有按值傳遞機制,那麼每個沒有被宣告為const 的引數就可能會隨每次函式呼叫而被改變。按值傳遞的危害最小,需要使用者做的工作也最少。毫無疑問,按值傳遞是引數傳遞合理的預設機制。

另外,如果作為實參的變數是乙個大型類的物件,分配並拷貝到棧中的時間和空間開銷往往過大。

要實現swap函式的效果,我們應如何處理呢?第乙個可行的做法是將形參宣告成指標:

void pswap(int *x, int *y)
在pswap函式中,由於傳遞的是兩個變數的記憶體位址(指標)使得我們可以直接操作對應的值。實際上這裡還是存在按值傳遞的問題,只是由原先的整形傳遞變成了指標傳遞。我們可以修改指標指向的記憶體卻依然無法修改指標本身。第二個可行的做法是想形參宣告為指標的引用:

void prswap(int *&x, int *&y) 

void prswap(int *&x, int *&y)

請注意,同乙個函式原型下我提供了兩種函式定義。可無論哪一種,在實參傳遞的階段都不會發生按值傳遞的問題。那麼兩種定義到底哪一種更滿足我們需求:

(1)交換記憶體中的值

(2)交換指標位址

如果單獨考慮本文的需求,第一種方法更滿足。但是,如果我們需要交換的是乙個大型類物件,第二種的效率則更高。

總結:記憶體管理是c++學習的乙個難點,初學者往往不容易掌握。但越是如此就越能體現乙個開發者的語言內功。

C語言中對於交換函式(SWAP)的編寫

乙個函式想修改另乙個函式的值,必須做到兩點 1.傳指標 2.解引用 正確 void swap int p1,int p2 錯誤示範1 未傳指標造成無法交換 void swap err1 int a,int b 錯誤示範2 未解引用造成無法交換 void swap err2 int p1,int p2...

C語言swap函式 解決函式不能交換值的問題

首先在看這一篇部落格之前應該要了解到在main函式裡面呼叫乙個main函式外的函式,引數傳過去只是乙個拷貝的值。如果直接把兩個int傳入函式,用乙個中間變數交換他們倆,那麼這只是改變了這個變數在swap函式裡面的值,回到main裡面就復原了。那麼,如何真正交換兩個int變數的值呢?用指標,把兩個in...

C 學習筆記二函式 函式過載

函式 都以static 開頭namespace 可變引數的函式 string country china vfunc names vfunc country sayhello tom 張大虎 狗剩 console.readkey static void vfunc params string val...