zl程序教程

您现在的位置是:首页 >  后端

当前栏目

C语言之变参函数

C语言 函数
2023-09-11 14:15:38 时间

实现可变参数函数max_int,从若干个传入的参数中返回最大值。
int max_int(int a, ...);

  • 如何获得 a 往后的参数列表? va_list 类型的变量
  • 如何定位 a 后面第一个参数的位置? va_start 函数
  • 如何获取下一个可变参数列表中的参数? va_arg 函数
  • 如何结束整个获取可变参数列表的动作?va_end 函数

总结来说:

  • va_list 类型的变量:存储变参列表中的参数
  • va_start 函数:定位变参列表中的第一个参数
  • va_end 函数: va_start 之后就要用 va_end 结束
  • va_arg 函数:获取变参列表中的下一个参数

这些宏都定义在头文件stdarg.h中:

1、void va_start(va_list argptr, lastparam);

va_start使用第一个可选参数的位置来初始化 argptr 参数指针。该宏的第二个参数必须是该函数最后一个有名称参数的名称。必须调用该宏,才可以开始使用可选参数。

2、type va_arg(va_list argptr, type);

展开宏va_arg会得到当前 argptr 所引用的可选参数,也会将 argptr 移动到列表中的下一个参数。宏va_arg的第二个参数是刚刚被读入的参数的类型。

3、void va_copy(va_list dest, va_list src);

va_copy使用当前的src值来初始化参数指针 dest。然后就可以使用 dest 中的备份获取可选参数列表,从 src 所引用的位置开始。

max_int 函数的代码实现:

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

int max_int(int n, ...) {//n为参数个数
    if (n < 0) return 0;
    int ans = 0;
    va_list arg;//存储...中所有的值
    va_start(arg, n);//变参列表的参数赋值给arg,初始化arg
    while (n--) {
        int temp = va_arg(arg, int); //对每个可选参数,读取类型为int的参数
        if (temp > ans) ans = temp;
    }
    va_end(arg);
    return ans;
}

int main() {
    printf("%d\n", max_int(3, 1, 2, 5)); //5
    printf("%d\n", max_int(2, 1, 7, 17)); //7
    printf("%d\n", max_int(3, 3, 6, 18)); // 18
    return 0;
}