2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、如何實現(xiàn)參數(shù)個數(shù)可變的函數(shù)如何實現(xiàn)參數(shù)個數(shù)可變的函數(shù)參數(shù)個數(shù)不定的函數(shù),最頻繁使用的就是printf()與scanf()。其實,我們也可以自己實現(xiàn)這樣的功能,首先看一個例子:#include#includeintSum(intfirstintsecond...)intsum=0t=firstva_listvlva_start(vlfirst)while(t!=1)sum=tt=va_arg(vlint)將當(dāng)前參數(shù)轉(zhuǎn)換為int類型va_e

2、nd(vl)returnsumintmain(intargcargv[])printf(“Thesumis%dn“Sum(3020101))1是參數(shù)結(jié)束標志return0在上面的例子中,實現(xiàn)了一個參數(shù)個數(shù)不定的求int型和的函數(shù)Sum()。函數(shù)中一開始定義了一個va_list型變量vl,該變量用來訪問可變參數(shù),實際上就是指針,接著使用va_start使vl指向第一個參數(shù),然后再使用va_arg來遍歷每一個參數(shù),va_arg返回參數(shù)列表中

3、的當(dāng)前參數(shù)并使vl指向參數(shù)列表中的下一個參數(shù)。最后通過va_end把vl指針清為NULL。在這里,va_start,va_arg,va_end其實都是宏,那么這些宏又是如何實現(xiàn)他們的功能的呢?一個很顯然的問題就是既然參數(shù)個數(shù)在函數(shù)調(diào)用之前沒有確定,所以,在函數(shù)定義的時候沒有辦法像普通函數(shù)那樣使用確定的變量來接受傳進來的參數(shù),于是,問題的關(guān)鍵就是如何接收到這些不確定的參數(shù)了?首先,看看函數(shù)調(diào)用時實際發(fā)生的情況,在函數(shù)調(diào)用的時候,使用棧傳遞

4、參數(shù),拿上例來說,如果調(diào)用Sum(3020101),那么參數(shù)入棧后的情形如下圖所示(假定按照自右至左的順序入棧):既然參數(shù)在棧中的情形已經(jīng)知道了,那么,如果使用指針(程序中的vl)指向第一個參數(shù)(va_start(vlfirst)),因為所有參數(shù)都是連續(xù)存放的,通過移動指針就可以訪問到每一個參數(shù)了(va_arg(vlint)),這就是我在程序中使用到那幾個宏的實現(xiàn)思想。明白了以上原理之后,就可以完全不使用宏,自己實現(xiàn)這樣的一個功能了,下

5、面的程序是我按照上面的思想改寫的:#includeintSum(intfirstintsecond...)intsum=0t=firstvl定義一個指針typefuncname(typepara1typepara2...)這種形式至少需要一個普通的形式參數(shù),后面的省略號不表示省略,而是函數(shù)原型的一部分,type是函數(shù)返回值和形式參數(shù)的類型。采用與UNIXSystemV兼容的聲明方式時,參數(shù)個數(shù)可變的函數(shù)原型是:typefuncname(

6、va—alist)va—dcl這種形式不需要提供任何普通的形式參數(shù),type是函數(shù)返回值的類型。va—dcl是對函數(shù)原型聲明中參數(shù)va—alist的詳細聲明,實際是一個宏定義,對不同的硬件平臺采用不同的類型來定義,但在最后都包括了一個分號,因此va—dcl后不再需要加上分號了。va—dcl在代碼中必須原樣給出,va—alist在VC中可以原樣給出,也可以略去,但在UNIX上的CC或Linux上的GCC中都要省略掉。此外,采用頭文件std

7、arg.h編寫的程序是符合ANSI標準的,可以在各種操作系統(tǒng)和硬件上運行,而采用頭文件varargs.h的方式僅僅是為了與以前的程序兼容。所以建議大家使用前者。兩種方式的基本原理是一致的,只是在語法形式上有一些細微的區(qū)別。以下主要就前一種方式對參數(shù)的處理做出說明。va—start使argp指向第一個可選參數(shù)。va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使argp指向參數(shù)列表中的下一個參數(shù)。va—end把argp指針清為NULL。函數(shù)體內(nèi)可以多

8、次遍歷這些參數(shù),但是都必須以va—start開始,并以va—end結(jié)尾。調(diào)用者在實際調(diào)用參數(shù)個數(shù)可變的函數(shù)時,要通過一定的方法指明實際參數(shù)的個數(shù),例如把最后一個參數(shù)置為空字符串(系統(tǒng)調(diào)用execl()就是這樣的)、-1或其他的方式。下面給出一個具體的例子,前一部分是采用了符合ANSI標準形式的代碼,后一部分是采用了與UNIXSystemV兼容方式的代碼。代碼中加了一些注釋,這里就不再解釋了。該例子已經(jīng)在VCWindowsNT4.0、CC

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論