形參與實參(從系統堆疊的角度理解)

2021-08-19 01:43:47 字數 910 閱讀 6629

#include

int *exchange(int one, int another);

void fun();

void realexchange(int *, int *);

void realexchange(int *one, int *another)

void fun()

}int *exchange(int one, int another)

int main()

在上述**中,exchange函式並沒有真正交換兩個變數的值。實參變數空間和形參變數空間不是同一塊空間,雖然在函式中交換了形參變數one 和another 的值,但實參num1和num2 值並沒有發生任何變化!

從堆疊知識解析realexchange函式,

主函式的申請的兩個變數num1和num2,(從右向左入棧)先取出num2變數的首位址值入棧(push),再取出num1變數的首位址值入棧 (從系統角度來看,從頭到尾只有乙個堆疊,包括執行緒,程序),先保護住棧底指標,再將棧底指標移到棧頂指標位置上,

(彙編檔案)

形參入棧後,棧頂指標向上走兩個四位元組(減去8b,向記憶體變小的方向移動),兩個形參變數在棧底指標的上邊。完成之後棧頂指標再向上走4b(temp), 並完成交換。但指標返回到原來形參變數(temp)時,向下移動8b,這8b這就是返回時的「現場資訊」!

然後結果返回主函式,呼叫結束。

形參與實參的區別。

1 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。2 實參可以是常量 變數 表示式 函式等,無論實參是何種型別的量,在進行函式呼叫時,它們都必須有確定的值,以便把這些值傳送給形參。因此...

形參與實參的區別

1 形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時,即刻釋放所分配的記憶體單元。因此,形參只在函式內部有效。函式呼叫結束返回主呼叫函式後則不能再使用該形參變數。2 實參可以是常量 變數 表示式 函式等,無論實參是何種型別的量,在進行函式呼叫時,它們必須有確定的值,以便把這些值傳送給形參。因此應...

形參與實參的區別

形參和實參的區別 形參出現在函式定義中,在整個函式體內都可以使用,離開該函式則不能使用。實參出現在主調函式中,進入被調函式後,實參變數也不能使用。形參和實參的功能是作資料傳送。發生函式呼叫時,主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。1.形參變數只有在被呼叫時才分配...