在调用函数时,如果我们希望函数的参数个数是可变的,那么便需要用到变参函数,既在每次函数调用时输入的参数个数不定。我们需要知道以下两点:
1 函数形参入栈方向为自右向左
2 在一个进程的内存空间中,栈低为高地址,栈顶为低地址。
所以我们可以从最后一个入栈的参数(形参第一个)根据地址以及栈空间的特点依次找到所有参数。
C语言代码实现(不定参求和)
#include<stdio.h>
#define first(p,sum,type) p=(void*)((char*)(&sum)+sizeof(type)) //跳过第一个存放有多少个数求和的变量地址,让p指向求和的第一个数
#define secend(p,type) p=*(type*)p; p=(void*)((char*)p+sizeof(type)) //先取值 在跳向下一个
#define first(p,sum,type) p=(void*)((char*)(&sum)+sizeof(type)) //跳过第一个存放有多少个数求和的变量地址,让p指向求和的第一个数
#define secend(p,type) p=*(type*)p; p=(void*)((char*)p+sizeof(type)) //先取值 在跳向下一个
int add(int sum,...)
{
int ret=0;
void*p=NULL:
int i=0;
first(p,sum,int);
for(i=0;i<sum;i++)
{
ret+=secend(p,int);
}
return ret;
return 0;
}