999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C++語言中函數參數傳遞方式的圖示說明

2010-01-01 00:00:00汪紅兵
計算機教育 2010年4期

摘要:學習C++語言中函數參數傳遞方式的關鍵是給出函數調用過程中內存各段內容的變化圖示。本文針對C++語言中三種函數參數傳遞方式,輔以代碼段內容圖示和堆棧段內容圖示,從機理上詳細解釋了函數參數的傳遞過程。實踐表明,這種圖示說明的方法在教學中取得了非常良好的效果。

關鍵詞:函數調用;參數傳遞;代碼段;堆棧段

1背景

“C++程序設計”是高等學校計算機專業或非計算機專業學生的必修課。對于非計算機專業的學生,C++語言是他們真正學習和使用計算機語言進行編程的關鍵入門,對于以后在其專業應用開發中具有至關重要的作用。即使以后使用其他編程語言進行專業項目的開發,如VB、C和Java語言,C++語言由于其概念的廣泛性和綜合性,也能夠使得他們很快學習并掌握這些編程語言。而對于計算機專業的學生來說,“C++程序設計”是“數據結構”、“算法設計”等核心課程的先修課,同時,“C++程序設計”中涉及的部分硬件知識也是其學習計算機原理的重要基礎。

但是,C++作為入門程序語言課程,對于初學者來說確實難度較大。周立章對自己的教學實踐進行總結,強調分層教學、案例教學和對計算機實驗進行改革的思想[1];李新霞在C++的前驅語言C語言的教學實踐中也表達了類似的思想[2]。因此,案例教學對C++語言來說是必不可少的。

對于大多數學生來說,C++程序設計學習中存在三個難點:(1)函數參數的傳遞;(2)指針變量的使用;(3)虛函數和多態性機制。

函數和類作為C++語言中的兩種基本模塊,分別支持C++語言進行面向過程的開發和面向對象的開發,而不論是何種開發方法,函數都是不可缺少的。一個完整的函數使用過程包括函數定義和函數調用,有時存在函數聲明,而函數調用過程中,在主調函數和被調函數之間發生著數據的交互,表現為函數參數的傳遞和被調函數的返回值。

其中,對于函數參數傳遞方式及相關教學研究,得到了很多關注。馬新將函數參數傳遞方式分為值傳遞方式和地址傳遞方式,并歸納總結了選用何種方式的條件[3];劉志華將函數參數傳遞方式分為簡單變量作參數、指針作參數、引用作參數、數組作參數和字符串作參數共五種方式,并對每一種情況進行了實例描述[4];譚慶將函數參數傳遞方式分為傳普通值調用、傳地址值調用和引用調用三種方式,并對其使用方法進行了總結[5];王萍、譚浩強和陳志泊在其編寫的相應教材中也對C++中函數參數傳遞方式給予了重點關注[6-8]。

本文就函數參數的傳遞方式,利用圖示說明的方法進行研究,旨在搞清各種函數參數傳遞方式的本質,為函數的學習奠定堅實的基礎。

2函數參數的傳遞方式

C++語言中函數參數的傳遞方式分為值傳遞、引用傳遞和指針傳遞。學生之所以不能正確掌握函數參數傳遞的相關內容,主要原因是不能了解函數參數傳遞過程中內存各段相關內容的變化,而解決這一問題的方法是給出函數調用過程中內存各段內容變化的圖示。

2.1內存分段

程序在執行時,內存是分段使用的,可分為代碼段(CS, Code Segment)、數據段(Data Segment)、附加段(ES, Extra Segment)和堆棧段(SS, Stack Segment),如圖1所示。

代碼段中存放程序執行代碼,數據段由靜態數據區和使用new請求分配數據的堆區組成,堆棧段中存放函數執行過程的各種數據,主要包括形式參數、局部變量和主調函數斷點地址。主調函數斷點地址指的是函數調用語句指令后的一條執行指令的地址。堆棧中每個函數的形式參數、局部變量和主調函數斷點地址稱為該函數的活動記錄。

根據馮諾依曼原理,當執行程序時,必須將該程序指令代碼加載到內存的代碼段,同時將第一條指令代碼的地址存入到PC寄存器,然后,每執行一條指令代碼,PC的內容自動加1,如此順序執行代碼段中的指令。而當發生函數調用時,程序的執行發生了流程的轉向。當流程轉向到被調函數時,PC中的內容更新為被調函數第一條指令的地址;而當流程重新回到主調函數時,PC中的內容更新為主調函數的斷點地址。函數調用過程的代碼段圖示說明,如圖2所示。

2.2值傳遞

采用值傳遞(pass-by-value)方式時,在堆棧段中為被調函數的形參列表分配內存,主調函數的實參列表分別賦給形參列表。因此,內存中每個形式參數和實際參數都是不同的變量,只是在發生函數調用的時刻,對應實參和形參變量的值相同而已。值傳遞方式的特點是被調函數對形參的任何操作不會影響主調函數的實參的值。

以下面程序作圖示說明。

int swap(int x, int y)

{

int temp;

temp = x; x = y; y = temp;

cout<<\"x=\"<

return temp;

}

void main()

{

int a = 10, b = 20;

swap(a, b);

cout<<\"a=\"<

}

當該程序提交給操作系統執行時,首先將程序代碼加載到代碼段,然后根據PC的內容來執行指令。由于PC存儲的內容為main函數中第一條指令的地址,故從該地址處開始順序執行。此時,執行的是main函數,也可以理解為操作系統調用main函數,操作系統相當于主調函數,main函數是被調函數。因此,堆棧段中為main函數分配活動記錄:a和b。而當執行到swap(a,b);語句時,發生了swap函數調用。堆棧段中為swap函數分配活動記錄: main函數斷點地址,x、y和temp,并且將a和b的值分別賦給形參x和y。修改PC的內容為swap函數的第一條指令的地址,程序由此重新開始順序執行。此時,對x和y的任何修改都不能影響到a和b。當swap函數執行結束后,從堆棧中刪除swap函數活動記錄,并且修改PC的內容為main斷點地址,程序由此繼續順序執行。值傳遞過程的堆棧段圖示說明,如圖3所示。

(a) 函數調用前 (b) 函數調用中(c) 函數調用后

圖3值傳遞過程的堆棧段圖示

上述程序的執行的結果是:

x=20,y=10

a=10,b=20

2.3指針傳遞

采用指針傳遞(pass-by-pointer)方式時,同樣也需要在堆棧段中為被調函數的形參列表分配內存。但是,由于形參定義為指針類型,從主調函數傳遞過來的是實參列表各變量的地址。因此,指針傳遞方式的特點是被調函數對形參做的任何操作也都影響到主調函數中的實參的值。

以下面程序作圖示說明。

int swap(int* x, int* y)

{

int temp;

temp = *x; *x = *y; *y = temp;

cout<<\"*x=\"<<*x<<\",*y=\"<<*y<

return temp;

}

void main()

{

int a = 10, b = 20;

swap(a, b);

cout<<\"a=\"<

}

當程序開始執行時,同樣也要在堆棧中為main函數分配活動記錄。而當執行到swap(a,b);語句時,發生了swap函數調用。堆棧段中為swap函數分配活動記錄: main函數斷點地址,指針變量y、指針變量x和temp。實參a和b分別傳遞給形參x和y。同樣,當swap函數執行結束后,從堆棧中刪除swap函數活動記錄,執行流程返回到main函數的斷點地址。指針傳遞過程的堆棧段圖示說明,如圖4所示。

(a) 函數調用前(b) 函數調用中 (c) 函數調用后

圖4指針傳遞過程的堆棧段圖示

上述程序的執行的結果是:

*x=20,*y=10

a=20,b=10

2.4引用傳遞

采用引用傳遞(pass-by-reference)方式時,同樣也需要在堆棧段中為被調函數的形參列表分配內存。但是,由于形參定義為引用類型,從主調函數傳遞過來的是實參列表各變量的地址。被調函數對形參的任何操作都被處理成是對實參的間接尋址。因此,引用傳遞方式的特點是被調函數對形參做的任何操作都影響到主調函數中的實參的值。

以下面程序作圖示說明。

int swap(int x, int y)

{

int temp;

temp = x; x = y; y = temp;

cout<<\"x=\"<

return temp;

}

void main()

{

int a = 10, b = 20;

swap(a, b);

cout<<\"a=\"<

}

當程序開始執行時,同樣也要在堆棧中為main函數分配活動記錄,而當執行到swap(a,b);語句時,發生了swap函數調用。堆棧段中為swap函數分配活動記錄:main函數斷點地址,b的地址、a的地址和temp。此時,對x和y的任何操作都轉化為根據a的地址和b的地址間接訪問主調函數中的a和b。因此,對形參x和y的任何操作都能影響到實參a和b。同樣,當swap函數執行結束后,從堆棧中刪除swap函數活動記錄,執行流程返回到main函數的斷點地址。引用傳遞過程的堆棧段圖示說明,如圖5所示。

(a) 函數調用前 (b) 函數調用中 (c) 函數調用后

圖5引用傳遞過程的堆棧段圖示

上述程序的執行的結果是:

x=20,y=10

a=20,b=10

3傳遞方式的比較

從函數參數的值傳遞、引用傳遞和指針傳遞的三種方式可以看出:

(1) 三種傳遞方式在發生函數調用時,程序的執

行流程都發生了跳轉,即由原來在主調函數的順序執行跳轉到被調函數的第一條指令處。

(2) 三種傳遞方式在發生函數調用時,都需要為被調函數分配相應的活動記錄,活動記錄包括主調函數的斷點地址、形參列表和局部變量。

(3) 采用值傳遞方式時,傳遞的是變量的值;采用引用傳遞和指針傳遞方式時,傳遞的是變量的地址。

(4) 對于引用傳遞方式,所傳遞的地址是通過對實參進行取地址運算來獲得的;而對于指針傳遞方式,所傳遞的地址就是實參的值。

(5) 對于值傳遞方式,對形參的修改不能影響到實參;對于指針傳遞和引用傳遞方式,對形參的修改一般都要影響到實參。

4結論

針對“C++程序設計”課程的難點之一——三種函數參數的傳遞方式,本文指出學習該知識點的關鍵是要弄清函數參數傳遞過程中內存各段相關內容的變化,尤其是代碼段和堆棧段。對三種函數參數的傳遞方式,分別輔以代碼段圖示和堆棧段圖示加以說明,從而從機理上解釋了函數參數的傳遞過程。

筆者將這種圖示說明的方法應用于數次“C++程序設計”的課堂教學中,均取得了良好的效果。

未來的研究內容是,結合數據段的內容變化,研究函數調用過程中有關靜態存儲變量、外部存儲變量以及堆上分配的變量占用數據段的情況。

參考文獻:

[1] 周立章. C++面向對象程序設計課程教學探索與實踐[J]. 西華大學學報:哲學社會科學版,2005(s):257-258.

[2] 李新霞. 也談C語言教學[J]. 計算機教育,2004(12):67-69.

[3] 馬新. C語言函數間參數傳遞機制的探討[J]. 白城師范學院報,2008,22(6):61-62.

[4] 劉志華. 深入探討C++語言中參數傳遞問題[J]. 哈爾濱師范大學自然科學學報,2007,23(4):63-65.

[5] 譚慶, 張瑞玲. C++語言中函數參數傳遞方式剖析[J]. 電腦學習,2007(4):50-51.

[6] 王萍. C++面向對象程序設計[M]. 北京:清華大學出版社,2004.

[7] 譚浩強. C++程序設計[M]. 北京:清華大學出版社,2006.

[8] 陳志泊,王春玲. 面向對象的程序設計語言C++[J]. 北京:人民郵電出版社,2002.

Graphic Illustration on the Transfer Ways of Function Parameters in C++ Programming Language

(WANG Hong-bing, YAO Lin)

(Fundamental Science Department, School of Information Engineering, University of

Science and Technology, Beijing100083,China)

Abstract: The key point on studying the transfer ways of function parameters in the C++ programming language, is the graphic illustration of the contents in several segments in RAM. With the use of the two graphic illustrations on the contents of code segment and stack segment in RAM, the principles of three transfer ways of function parameters in the C++ programming language is explained in detail. It shows that this way of graphic illustration has got very good results in our factual teaching work.

Key words: function invocation; parameter transfer; code segment; stack segment

(編輯:姚彥如)

主站蜘蛛池模板: 国产精品思思热在线| 1级黄色毛片| 99视频在线免费| 欧美精品色视频| 亚洲色图综合在线| 亚洲欧美不卡视频| 欧美丝袜高跟鞋一区二区| 欧美成人一区午夜福利在线| 成年人国产视频| 91丨九色丨首页在线播放| 免费女人18毛片a级毛片视频| 制服无码网站| 熟妇丰满人妻| 亚洲黄色高清| 国产精品毛片一区视频播 | 日韩精品亚洲一区中文字幕| 亚洲人成影院午夜网站| 欧美A级V片在线观看| 麻豆精品在线视频| 看你懂的巨臀中文字幕一区二区| 色哟哟精品无码网站在线播放视频| 欧美精品啪啪一区二区三区| 国产女人喷水视频| 伊在人亚洲香蕉精品播放 | 免费一级无码在线网站| 国产免费久久精品99re不卡| 女人一级毛片| 又黄又湿又爽的视频| 无码AV动漫| 99久久精品久久久久久婷婷| 国产成人一区免费观看| 欧美午夜性视频| 欧美在线视频a| 国外欧美一区另类中文字幕| 视频在线观看一区二区| 尤物精品视频一区二区三区| 色综合久久综合网| 不卡网亚洲无码| 亚洲资源站av无码网址| 无码一区中文字幕| 日韩人妻少妇一区二区| 2021国产精品自产拍在线观看 | 国产欧美性爱网| 国产精品内射视频| 午夜视频免费一区二区在线看| 久久久精品无码一区二区三区| 丝袜国产一区| 午夜国产在线观看| 伊人色天堂| 四虎亚洲精品| 亚洲va视频| 亚洲国产看片基地久久1024| 国产成人午夜福利免费无码r| 日本一本正道综合久久dvd| 亚洲国产成人自拍| 久久一日本道色综合久久| 精品国产免费人成在线观看| 国产自在线拍| 国产日韩精品欧美一区喷| 911亚洲精品| 在线观看国产精美视频| 一级看片免费视频| 国产天天色| av在线手机播放| 久久免费成人| 亚洲av无码成人专区| 性欧美精品xxxx| 久久中文字幕不卡一二区| 亚洲首页在线观看| 99久久性生片| 福利在线不卡| 欧美a级在线| 亚洲美女AV免费一区| 亚洲天堂免费| 高清色本在线www| 亚洲男人的天堂网| 无码久看视频| 91视频日本| 国产毛片不卡| 亚洲无码日韩一区| 国产精品女熟高潮视频| 国产毛片不卡|