可变参数在编程中的实现。
stdarg.h标准库提供的宏支持了可变长参数列表的使用。
当然,在一些情况下也可以自己通过其实现原理来使用可变长参数编程。
条件一:
C语言编程中函数的形参入栈顺序都是从右至左。栈的生长方向是,低地址《—— 高地址,而且栈由系统分配,不存在碎片化内存。
结论:只要知道一个参数的地址,就可以顺势推出其他参数的地址。
在使用可变长参数的情形下,都会想方设法的标注参数的类型和个数,因为我们无从得知!
最经典的用法:extern int printf(const char *format,…);函数,再给出的一个个%d和%f等等条件中,统计%即可知道携带了几个参数,与%之配对的字符代表了对应位置的
参数类型。
假设:printf(“a:%d , b:%f!”, 10, 20.0f);
编程思路:
遇到了第一个%代表该取参了:
char *p = &format+1;//指向第一个参数10的低地址
并且第一个%匹配的参数是类型“d”,那就通过 int a = (int )p;来取数,顺便 p += sizeof(int);使其指向下一段内存的低地址。
//试验源码
#include<stdlib.h>
#include<stdio.h>
int print(int nnum,...);
int main()
{
print(1, 2, 3.0f, 4, 5);
system("pause");
}
int print(int nnum, ...)
{
char *p =(char *)(&nnum + 1);
printf("%d", *(int *)p);
p += sizeof(int);
printf("%f", *(double *)p);//很多编译器总是以double长度来存储float,取用的时候进行截断。
p += sizeof(double);
printf("%d", *(int *)p);
p += sizeof(int);
printf("%d", *(int *)p);
p += sizeof(int);
return 0;
}