说到C语言中的不定参数,就需要提到C语言中函数调用时的参数入栈顺序了
显然,我们如果可以取得参数1的地址,那么顺藤摸瓜,就可以找到其他参数了,那么怎么确定传递了多少个参数呢,我们暂时规定最后一个参数为0.
用常规的方法,
#include <stdio.h>
int myfunc(int first, ...)
{
int sum = 0;
int * varg_ptr = NULL;
sum = first;
varg_ptr = (&first) + 1;
while(0 != (*varg_ptr))
{
sum += (*varg_ptr);
varg_ptr++;
}
return sum;
}
int main()
{
int sum = 0;
sum = myfunc(1, 2, 3, 4, 5, 0);
printf("SUM = %d\n", sum);
}
便可以实现对不定参数的求和。
在C语言中,规定了一组宏,是使我们程序员不再需要注意那么多细节。
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //类型n的大小
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //ap指向第一个不定参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址 返回当前ap指向的值,并且增加ap
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效
其他的就比较好看懂了。
#include <stdio.h>
#include <stdarg.h>
int myfunc(int first, ...)
{
int sum = 0;
int num = 0;
va_list varg_ptr;
num = first;
va_start(varg_ptr, first);
do
{
sum += num;
num = va_arg(varg_ptr, int);
}while(num != 0);
va_end(varg_ptr);
return sum;
}
int main()
{
int sum = 0;
sum = myfunc(1, 2, 3, 4, 5, 0);
printf("SUM = %d\n", sum);
}