1,帶參數的main函數函數
#include <stdio.h> int main(int argc,char *argv[]) { int i; for(i=0;i<argc;i++) { puts(argv[i]); } return 0; }
結果:spa
will@will-laptop:~/ex/11$ ./a.out 4 1 2 3 4 ./a.out 4 1 2 3 4
2,無指定函數參數按地址進行輸入指針
#include <stdio.h> void test (int a,...) { printf("paral,a:%d\n",a); printf("para2 :%s\n",(char *)*(&a+1)); //由於最後獲得的是字符串的首地址,因此變成指針 printf("para3 : %lf\n",*(double *)(&a+2)); //後一個*號是把值定義爲指針,前一個定義爲取出地址的值 printf("para4 :%c\n",*(&a+4)); printf("para5 :%d\n",*(&a+5)); } int main(void) { test(123,"hello",3.14,'a',567); return 0; }
結果:code
will@will-laptop:~/ex/11$ ./a.out paral,a:123 para2 :hello para3 : 3.140000 para4 :a para5 :567
3,調用庫函數處理無指定形參blog
#include <stdio.h> #include <stdarg.h> //這個va_list 是在stdarg.h文件中定義 //va_start和va_end函數也是 //va_start(va_list ap,last); //type va_arg(va_list,type); //void va_end(va_list ap); void test (int a, ...) { va_list ap; va_start(ap,a); printf("para 1: %d\n",a); printf("para 2: %s\n",va_arg(ap,char*)); printf("para 3: %lf\n",va_arg(ap,double)); printf("para 4: %c\n",va_arg(ap,int)); printf("para 5: %d\n",va_arg(ap,int)); va_end(ap); } int main(void) { test(123,"hello",3.14,'a',567); return 0; }
結果:字符串
will@will-laptop:~/ex/11$ ./a.out para 1: 123 para 2: hello para 3: 3.140000 para 4: a para 5: 567
這個宏被展開成一個包含類型爲type,值爲ap的表達式。參數ap應該首先被宏va_start 或 va_copy初始化,但又必須在被宏va_end調用以前使用。每次調用va_arg都會改變ap值使得後續的參數值能被依次添加。參數type應該是 一個類型名,而且用type*可以獲得該類型的指針類型io