用过printf()函数的热都知道,printf的参数可以有多个,它是可变的,根据我们输出参数的类型以及个数的不同来确定参数。今天来学习C语言中参数可变的函数是如何实现的。

文章目录

1 可变参数

首先我们要明白一点,在C语言中,参数可变的函数的实现,要依赖于头文件stdarg.h。所以在实现这样的函数的时候,需要包含该头文件。

其次,实现函数可变参数需要使用以下几个类型参数,我们需要熟练掌握它们的使用,下面先看看这些参数是什么?

  1. va_list:参数集合
  2. va_arg:取具体参数值
  3. va_start:标识参数访问的开始
  4. va_end:标识参数访问的结束

看了上面的参数的意义,还是不知道什么是什么。下面看一个例子,就能彻底明白了。

下面函数的意思是求n个数的平均值。这n个数直接作为参数传递给函数(这么写肯定是效率不高,这里只是为了学习使用)

  • 45-2.c
#include <stdio.h>
#include <stdarg.h>

float average(int n, ...){  //这个n代表参数的个数,后面的...代表后面的参数不确定是什么
    va_list args;      // args代表函数可变参数的集合
    int i = 0;
    float sum = 0;
    
    va_start(args, n); // 如果要遍历args参数的话,则从args参数集合的开始,遍历n次结束
    
    for(i=0; i<n; i++){
        sum+=va_arg(args, int);  // 开始遍历,取具体参数值,类型为int
    }
    
    va_end(args);      // 代表参数集合args访问结束
    
    return sum/n;
}

int main(){
    
    printf("%f\n", average(5,1,2,3,4,5));
    printf("%f\n", average(4,1,2,3,4));
    return 0;
}
  • 上述代码编译运行结果为:


上面代码不难,主要是学会使用那几个参数的使用。我们需要注意以下几点:

  • 可变参数必须从头到尾按照顺序逐个访问
  • 参数列表中,至少要存在一个确定的命名参数
  • 可变参数函数无法确定实际的参数的数量,需要在运行的时候根据具体的传参结果来计算
  • 可变参数函数,无法确定参数的实际类型

注意:如果va_arg中指定的参数的类型与实际的不匹配,那么最终的计算结果将是不可预测的。

2 总结

  • 学会定义可变参数的函数。主要是使用方法。