Welcome

首页 / 软件开发 / C语言 / 学点C语言(40):函数 - 多参函数

学点C语言(40):函数 - 多参函数2010-04-30 博客园 万一像 printf 这种多参函数,是借用 stdarg.h 中的宏实现的.

va_list : 用于定义遍历参数列表的指针;
va_start : 让指针指向第一个参数;
va_arg : 获取下一个参数,并向后移动一个位置;
va_end : 释放指针,完成遍历.

1. 整数求和:

本例实现了对系列整数求和,要求至少要有三个参数,并且最后一个必须是 0.

最后的 0 用于识别列表结束.

#include <stdio.h>
#include <stdarg.h>

int sum(int n1,int n2,...)
{
/* 定义一个指向参数列表的指针,必须是 va_list 类型 */
va_list p;

/* 定义输出变量,并先获取前两个值 */
int out = n1 + n2;

/* 把指针指向最后一个明确的变量 */
va_start(p,n2);

/* 用 va_arg 获取下一个整数值,va_arg 会同时把指针向后移动整数大小的位置 */
/* 本例是假定参数都是整数值,遇 0 终止; 这样在使用是最后一个参数必须是 0 */
while ((n2 = va_arg(p,int)) != 0) out += n2;

/* 结束 */
va_end(p);

return(out);
}

int main(void)
{
printf("%d ",sum(2,2,2,0)); /* 6 */
printf("%d ",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
getchar();
return 0;
}

2. 整数求和(修改版):

这个函数要求至少要两个参数,最后必须是 0.

#include <stdio.h>
#include <stdarg.h>

int sum(int n1,...)
{
va_list p;
int out = n1;
va_start(p,n1);
while ((n1 = va_arg(p,int)) != 0) out += n1;
va_end(p);
return(out);
}

int main(void)
{
printf("%d ",sum(2,0)); /* 2 */
printf("%d ",sum(1,2,3,4,5,6,7,8,9,0)); /* 45 */
getchar();
return 0;
}