娓娓道來c指標 8 開發可變引數函式

2021-06-22 23:52:12 字數 1405 閱讀 9216

(8)開發可變引數函式

在c語言中,可變引數的函式極其常見,如常用的printf()。可變引數函式的一般形式如下:

返回值型別 函式名(型別1 引數1,型別2 引數2,...型別n 引數n,...);
如上所示,這是乙個典型的可變引數樣式,它共有n個確定的引數,最後的...表示可變引數的含義。必須指出...必須位於最後,並且它至少要有乙個確定的引數,原因後面陳述。

為了開發可變引數的函式,需用到頭檔案stdarg.h。下面共給出兩個例項,在例項中詳細解釋用法。一是求可變個整數的和;二是模仿printf函式。

例項一:求可變個整數的和

#include#include#include/*

對可變個引數求和

count是可變個引數的個數

*/int sum(int count, ...)

return sum;

}int main()

執行    15

在sum中共用到了va_list型別,va_start()、va_arg()和va_end()巨集。

其中,va_list就是char*型別,故直接使用char*,也是可以的。但推薦使用va_list,這樣更能表達含義。va_start()、va_arg()和va_end()都是在stdarg.h中定義的巨集。va_start()的作用是使va_list型的變數指向第乙個可變引數,故需要使用到離...最近的乙個固定的確定的引數,這就是在設計可變引數函式時至少需要乙個確定引數的原因。它的真實原因與函式的引數在記憶體中的分布有關:

顯然,由最後乙個引數的位址,可以確定第乙個可變引數的位址。接著使用va_arg(pdata, int),不斷解析pdata指向記憶體區域,且要指明用何種方式解析,這是va_arg()第二個引數的作用,解析完後,pdata指向下乙個可變引數的位址。由此即可得到所有的可變引數的值。

例項二,模擬printf()函式

#include#include#include/*

簡單模擬printf()函式

format是輸出格式字串

*/int iprintf(char *format,...)

count++;

} va_end(p);

return count;

}int main()

執行

在上面的模擬printf()函式中我們實際上還是靠庫函式printf()來實現輸出,模擬的只是原理。

專欄目錄

娓娓道來c指標 3 指標和陣列

3 指標和陣列 在c中指標和陣列似乎有著千絲萬縷的關係。其實它們不是一回事 指標是指標,陣列是陣列,兩者不相同。說它們有關係,不過是因為常見這樣的 int main int n sizeof array sizeof int int p array int i for i 0 i n i print...

娓娓道來c指標 3 指標和陣列

3 指標和陣列 在c中指標和陣列似乎有著千絲萬縷的關係。其實它們不是一回事 指標是指標,陣列是陣列,兩者不相同。說它們有關係,不過是因為常見這樣的 cpp view plain copy print int main int n sizeof array sizeof int int p array...

娓娓道來c指標 4 解析c的宣告語句

4 解析c的宣告語句 在繼續探索c指標之前,有必要來解析下c語言中複雜的宣告語法。只需要記住兩則 乙個原則,乙個規則。原則 先看標示符。規則 運算子優先順序是規則。舉例說明 1.最簡單的 int array 3 結論 array是陣列,陣列規模是3,元素型別是int。解析過程 先看標示符 array...