從彙編的底層代碼實現角度深入理解形參和實參

形參是在函數定義時給出的參數,實參是主調函數中調用某一個函數時給出的。

形參和實參的作用是實現主調函數與被調函數之間的數據傳遞,也就是我們通常所說的傳參

形參實際是實參在被調函數中的一份拷貝,調用時壓入棧中,分配內存,當調用函數結束,內存就會釋放,那一份拷貝隨之釋放。

從底層彙編代碼來看,主調函數在調用另外一個函數的時候,會先將參數傳入,調用函數是通過棧過程來實現的,被調函數把參數壓入棧中新開闢的空間中,當調用結束,空間就會被釋放。

下面是一個遞歸函數調用函數本身的彙編代碼,首先是調用以前傳參。


將傳遞過來的參數,壓入新開闢的棧空間中。在調用結束後釋放。


形參和實參都有各自的有效範圍,實參只在主調函數中有效,形參只在被調函數中有效,所以無法通過修改形參來妄想修改主調函數的實參,從彙編的角度看,每一個函數都有自己的一個棧,實參是存在於主調函數的棧空間中,而形參是存在於被調函數的棧中,各自分配的內存地址是不同的。所以要想達到修改形參來修改實參的目的,方式就是通過傳指針或者傳引用,將實參的地址傳遞給形參,也就是對形參的改變也就是修改實參。

int i=10; 這裏i是一個變量名,實際上從彙編的底層代碼角度看,不存在變量名的概念,這裏是在內存中分配一個int型的大小的空間來存放10,修改i的值,就會修改空間中的10的值,所以i對應的實際是內存的地址。所以就是修改內存中的內容的唯一方式就是通過內存的地址,因爲底層中取的值就是通過地址獲得的

上面從彙編底層代碼的角度看會很清晰的瞭解所有的過程,但是這些都是編譯器做的事,高級語言給我們的這些都是透明的,給我們的感覺就是,形參和實參在內存中的地址不同,形參是實參的一份拷貝,形參在被調函數結束以後,就會被釋放掉,從而實參不會受到影響,但是如果傳遞的是實參的地址,則在被調函數中使用的也是實參的地址,改變的將會實參本身。

接下來看一下形參與實參的幾點區別:

1有效範圍不同,實參只在主調函數中有效,形參只在被調函數內部有效,當被調函數結束以後不可以在使用。

2內存地址不同,形參只在被調用時纔會分配內存,結束後會釋放,不會對實參產生影響,除非是傳遞的是地址。

3實參在傳遞時必須是確定的值,可以是常量,變量,表達式,函數等,但是必須是確定的值。

4數據參數傳遞,只能是實參到形參單向傳遞

5實參和形參在數量上,類型上,順序上必須嚴格一致,否則類型不匹配錯誤

發佈了40 篇原創文章 · 獲贊 34 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章