1,带参数的main函数
#include <stdio.h> int main(int argc,char *argv[]) { int i; for(i=0;i<argc;i++) { puts(argv[i]); } return 0; }
结果:
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 ",a); printf("para2 :%s ",(char *)*(&a+1)); //因为最后得到的是字符串的首地址,所以变成指针 printf("para3 : %lf ",*(double *)(&a+2)); //后一个*号是把值定义为指针,前一个定义为取出地址的值 printf("para4 :%c ",*(&a+4)); printf("para5 :%d ",*(&a+5)); } int main(void) { test(123,"hello",3.14,'a',567); return 0; }
结果:
will@will-laptop:~/ex/11$ ./a.out paral,a:123 para2 :hello para3 : 3.140000 para4 :a para5 :567
3,调用库函数处理无指定形参
#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 ",a); printf("para 2: %s ",va_arg(ap,char*)); printf("para 3: %lf ",va_arg(ap,double)); printf("para 4: %c ",va_arg(ap,int)); printf("para 5: %d ",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*能够得到该类型的指针类型