函數形參和實參問題

@著作權歸作者所有:來自CSDN博客作者大鬍子的艾娃的原創作品,如需轉載,請註明出處,否則將追究法律責任。
如有錯誤的地方歡迎指正,謝謝!

一、 形參和實參的區別

實參(argument):
在調用時傳遞給函數的參數。 實參可以是常量、變量、表達式、函數等, 無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。實參不能作用於被調用函數中,即傳值後在被調用函數中不能使用。

形參(parameter):
由於它不是實際存在變量,所以又稱虛擬變量。是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳入的參數.在調用函數時,實參將賦值給形參。注意實參的個數和類型應與形參一一對應(),並且實參必須要有確定的值。形參的作用域爲對應函數,函數調用結束返回後釋放。

二、 實參和形參3中的結合方式
1、無實參調用方式
a、 實參和形參都沒有 (無參函數)。
形式:函數返回數據類型 函數名(形參表位置);
此時形參表的位置可以爲空,也可填上保留字void,但是無論怎樣兩邊的括號不可以省略。例如:int show();void show(void);。

b、 無實參但有形參(必須是有默認形參)
形式:函數返回數據類型 函數名(有初始化的形參表);
無實參但有形參,此時必須是有默認形參。例如:int sum(int a=1,int b=2){return a+b;}int main(){int c=sum();}

2、傳值調用方式
實參值通過棧從實參表從右向左一一傳遞給形參,調用時函數中的形參值的任何修改都會影響帶實參,函數調用中發生的數據傳送是單向的。形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只有在函數內部有效。函數調用結束返回主調函數後則不能再使用該形參變量。

注意:若函數具有默認形參,默認值的形參必須從右至左連續定義,即在一個具有默認值的形參的右邊不能有未指定默認值的形參;在函數調用時,如果省略了每個實參,則直到最右端的實參都要省略(省略的實參與之對應的形參都要有默認值)。

3、地址傳遞方式
a、指針方式
如果以指針作爲函數的形參,在調用時實參將值傳遞給形參,也就是實參和形參指針變量指向同一內存地址,所以被調用函數中通過形參對數據值的改變同時也會影響到實參所指向的數據值,實現參數雙向傳遞的目的,並且此時沒有給形參另外分配內存。
注意:數組也屬於指針。

b、引用方式
與指針方式所述基本相同,但又有引用的特性。引用封鎖了對地址的可修改性,只能修改引用所指向變量的值,是的間接訪問操作更安全。
注意:指針可以有整型數強制類型轉換得到,但引用不可以由強制類型轉換。

注意:關於const修飾的點擊另外一篇博客https://blog.csdn.net/qq_43148810/article/details/83218314

三、 哪些情況實參與形參類型不匹配時仍然不會出錯

1、基本數據類型傳值調用方式會進行隱式的強制轉換,轉到形參,按形參類型處理,不會按實參類型處理。雖然編譯器不會出錯,但是很多時候回警告,並且要注意類型之間的轉化。

2、基本數據類型傳地址調用方式不能進行隱式的強制轉換,此時數據類型不匹配會編譯器會報錯。同樣類型的數組或指針變量的形參和實參可以相互匹配。

3、其他數據類型的實參和形參不匹配時一般都會報錯(例如struct等)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章