02.29 深入理解被調函數與主調函數之間的傳值、傳址、值返回、址返回

函數的英文是function,有功能的意思,函數的作用在於合理分配功能,增強程序的可讀性。合理分解功能,降低程序的複雜性。隱藏函數內部的數據和實現,儘可能將問題侷限於函數本身。

函數可以理解為一種功能抽象,一些語句的封裝或聚合。由函數的各部分形成一個數據描述、輸入、處理、輸出的結構。

函數調用時都會在棧上開闢自己的內存空間(棧幀),用於存放返回地址、實參值、函數體內的局部變量。

實參和形參的結合相當於用實際參數值初始化形式參數 ,可以理解為:形參=實參(實際值或地址值),存儲到棧幀。

函數的參數和返回值可以是值、指針和引用,它們有不同的作用。

函數是程序重要的模塊,在函數內和函數外定義的變量(數據)分別存儲於不同的內存空間,對應於不同的作用域和存續期。

模塊(函數)之間的交互在於傳參與函數返回,傳值、傳址、值返回、址返回區別如下:

傳址或址返回可以是指針或引用,只是後者的寫法更簡潔(引用不能為空指針);

傳址時在函數體內可以修改指針本身或指針指向的值,但前者會與主調函數無關。

如果用址傳遞想修改一個一級指針,則形參必須是一個二級指針或指針引用。

當然,也可以使用指針返回(而不是參數返回),這樣更簡潔

如果被調函數的形參是指針引用,有申請堆空間,則主調函數需要釋放堆內存;

數組傳遞默認為傳址,其它類型,包括複合類型默認為傳值。

通常,從健壯性考慮,需要對函數的輸入、輸出做一些邊界或合法性檢查。

從可讀性考慮,通常也要對函數的功能、輸入、輸出做一些註釋性說明。

在C++中,函數可以重載,參數可以使用默認值,可以定義為inline;

應當說,值傳遞在被調函數和主調函數之間的耦合度更低,相互更獨立,而值傳遞的效率更高。

-End-