C 可变参数
#include <stdio.h> #include <stdarg.h> extern char* baseconv(unsigned int,int); //格式化数字 void miniprintf(const char *fmt,...) { const char* p; int i; unsigned u; char* s; va_list argp; va_start(argp,fmt); for(p=fmt;*p!='\0';p++) { if(*p!='%') { putchar(*p); continue; } switch(*++p) { case 'c': i=va_arg(argp,int);//“默认参数提升”规则,在可变参数部分 putchar(i); break; case 'd': i=va_arg(argp,int); if(i<0) { i=-i; putchar('-'); } fputs(baseconv(i,10),stdout); break; case 'o': u=va_arg(argp,unsigned int); fputs(baseconv(u,8),stdout); break; case 's': s=va_arg(argp,char*); fputs(s,stdout); break; case 'u': u=va_arg(argp,unsigned int); fputs(baseconv(u,10),stdout); break; case 'x': u=va_arg(argp,unsigned int); fputs(baseconv(u,16),stdout); break; case '%': putchar('%'); break; } } va_end(argp); }
关于可变参数的部分,仔细想想的话:应该是把所有的参数放到了一个块内存中,然后将数据一个个取出来。但是取出来的时候要定义类型,每个类型确定了取出来的内存的大小。
ps:定义函数时第一个参数不能缺少吧,然参数的开始地址怎么找,至少要给个名字(地址)
##15-8-2
对于函数在栈中
在这幅图中,可以看到的:
1.对于函数来说,形参在函数栈的最底端,而且是从后往前开始进栈的;
2.在形参之后,马上就是函数的返回值数据;
3.再才是函数自己的局部变量数据
也就是说在C语言的可变参数这块中,不可或缺的就是第一个参数的确定,第一个参数确定了后面读取多少个参数
##15-8-2
va_arg(argp,var_Type);