国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C語言中函數參數的入棧順序詳解及實例

2020-05-23 13:53:23
字體:
來源:轉載
供稿:網友

C語言中函數參數的入棧順序詳解及實例

對技術執著的人,比如說我,往往對一些問題,不僅想做到“知其然”,還想做到“知其所以然”。C語言可謂博大精深,即使我已經有多年的開發經驗,可還是有許多問題不知其所以然。某天某地某人問我,C語言中函數參數的入棧順序如何?從右至左,我隨口回答。為什么是從右至左呢?我終究沒有給出合理的解釋。于是,只好做了個作業,于是有了這篇小博文。

#includevoid foo(int x, int y, int z){    printf("x = %d at [%X]n", x, &x);    printf("y = %d at [%X]n", y, &y);    printf("z = %d at [%X]n", z, &z);}int main(int argc, char *argv[]){    foo(100, 200, 300);    return 0;}

 運行結果:

x = 100 at [BFE28760]y = 200 at [BFE28764]z = 300 at [BFE28768]

C程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什么呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,Pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如VisualC++。即然兩種方式都可以,為什么C語言要選擇從右至左呢?

進一步發現,Pascal語言不支持可變長參數,而C語言支持這種特色,正是這個原因使得C語言函數參數入棧順序為從右至左。具體原因為:C方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。

因此,C語言函數參數采用自右向左的入棧順序,主要原因是為了支持可變長參數形式。換句話說,如果不支持這個特色,C語言完全和Pascal一樣,采用自左向右的參數入棧方式

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 横山县| 井陉县| 景洪市| 尼勒克县| 孝昌县| 光泽县| 志丹县| 凤台县| 商南县| 锡林浩特市| 双流县| 合水县| 阿城市| 来安县| 武夷山市| 阿尔山市| 曲周县| 九龙坡区| 土默特左旗| 舟曲县| 大余县| 绍兴市| 延川县| 涞源县| 云南省| 霍林郭勒市| 庆安县| 台山市| 攀枝花市| 安陆市| 延安市| 渝中区| 故城县| 杨浦区| 商丘市| 吐鲁番市| 宣汉县| 馆陶县| 温宿县| 饶平县| 汉中市|