一,、什么是可變參數(shù) 在C語言編程中有時(shí)會(huì)遇到一些參數(shù)個(gè)數(shù)可變的函數(shù),,例如printf(),scanf()函數(shù),其函數(shù)原型為: 二,、C語言---簡單的可變參數(shù)例子(實(shí)現(xiàn)思想) 1,、整型數(shù)據(jù)的輸出 #include <stdio.h> #include <stdarg.h> void ar_cnt(int cnt,...); void ar_cst(char const *s,...); int main(int argc, char* argv[]) { int in_size =_INTSIZEOF(int); printf("int_size=%d\n",in_size); ar_cnt(5,1,2,3,4); return 0; } void ar_cnt(int cnt,...) { int value1=0; int i=0; int arg_cnt = cnt; va_list arg_ptr; va_start(arg_ptr,cnt); for(i=0;i<cnt;i++) { value1=va_arg(arg_ptr,int); printf("posation %d=%d\n",value1,i+1); } va_end(arg_ptr); } 運(yùn)行結(jié)果: 2、字符串的輸出 #include <stdio.h> #include <stdarg.h> void PrintLines(char *first,...) { char *str; va_list v1; str = first; va_start(v1,first); do { printf("%s\n",str); str=va_arg(v1,char*); } while (str != NULL ); va_end(v1); } int main(int argc, char* argv[]) { PrintLines("First","Second","Third","Fourth",NULL); return 0; } 運(yùn)行結(jié)果: 3,、找出最大數(shù) #include <stdio.h> #include <stdarg.h> int FindMax(int amount,...) { int i,val,great; va_list v1; va_start(v1,amount); great=va_arg(v1,int); for(i=1;i<amount;i++) { val=va_arg(v1,int); great=(great>val)?great:val; } va_end(v1); return great; } int main(int argc, char* argv[]) { int max=FindMax(5,100,20,456,102,4,300); printf("The Max one is %d\n",max); return 0; } 運(yùn)行結(jié)果: 三,、對(duì)va_arg,va_list,va_start,va_end,_INTSIZEOF剖析
功能:以固定參數(shù)的地址為起點(diǎn)確定變參的內(nèi)存起始地址,獲取第一個(gè)參數(shù)的首地址 返回值:無 <2>原型:va_list 類型的變量,,va_list arg_ptr ,這個(gè)變量是指向參數(shù)地址的指針,,因?yàn)榈玫絽?shù)的地址之后,再結(jié)合參數(shù)的類型,,才能得到參數(shù)的值,。 <3>原型:type va_arg(va_list arg_ptr,type); 功能:獲取下一個(gè)參數(shù)的地址 返回值:根據(jù)傳入?yún)?shù)類型決定返回值類型 <4>原型:void va_end(va_list arg_ptr); 功能:將arg_ptr指針置0 返回值:無
⑴在程序中將用到以下這些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); va在這里是variable-argument(可變參數(shù))的意思. 這些宏定義在stdarg.h中,所以用到可變參數(shù)的程序應(yīng)該包含這個(gè)頭文件. ⑵函數(shù)里首先定義一個(gè)va_list型的變量,這里是arg_ptr,這個(gè)變量是指向參數(shù)地址的指針.因?yàn)榈玫絽?shù)的地址之后,再結(jié)合參數(shù)的類型,,才能得到參數(shù)的值,。 ⑶然后用va_start宏初始化⑵中定義的變量arg_ptr,這個(gè)宏的第二個(gè)參數(shù)是可變參數(shù)列表的前一個(gè)參數(shù),也就是最后一個(gè)固定參數(shù)。 ⑷然后依次用va_arg宏使arg_ptr返回可變參數(shù)的地址,得到這個(gè)地址之后,,結(jié)合參數(shù)的類型,,就可以得到參數(shù)的值。然后進(jìn)行輸出,。 ⑸設(shè)定結(jié)束條件,,這里的條件就是判斷參數(shù)值是否為-1。注意被調(diào)的函數(shù)在調(diào)用時(shí)是不知道可變參數(shù)的正確數(shù)目的,,程序員必須自己在代碼中指明結(jié)束條件,。至于為什么它不會(huì)知道參數(shù)的數(shù)目,讀者在看完下面這幾個(gè)宏的內(nèi)部實(shí)現(xiàn)機(jī)制后,,自然就會(huì)明白,。
三,、參考文獻(xiàn):
http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html |
|