C语言——可变参数列表

C语言中的可变参数列表

可变参数列表

在函数形参的类型及数目不确定的时候,可以使用可变参数列表

通过一个例子,我们来引入可变参数列表

编写一个函数,来计算一组数据的平均分

解决这个问题我们首先解决的难题就是数据的个数不确定,我们可以使用数组来轻而易举的解决这个问题
当然,接下来要说到的可变参数列表是另一种解决方法

先来了解一个头文件 stdarg.h

可变参数列表是通过来实现的,它们被定义在stdarg.h这个头文件中

先写个代码来个直观的

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

//函数原型 "..."就是可变参数列表
    //这个函数用来求n_values个数据的平均值
double average(int n_values, ...);


int main(void){

    printf("%lf", average(5, 1, 2, 3, 4, 5));
    return 0;
}

//函数实现
double average(int n_values, ...){

    va_list list;//参数列表构成的数组

    double sum = 0;//求累加和

    va_start(list, n_values);//一个 宏 ,准备访问这个数组


    for(int i = 0; i < n_values; ++i)
        sum += va_arg(list, int);//需要用到一个访问的 宏

    va_end(list);//访问完毕后要调用这个宏

    return sum / n_values;
}

需要使用的类型及宏

stdarg.h中,声明了一个 类型 va_list

可以把这个类型理解为一个数组,可变参数构成的数组

还有三个宏

vastart 类似于读取文件时打开一个“流”
vaarg 类似于读取文件时的read函数,每读取一次,指向下一个值 vaend 类似于读取文件后,关闭一个文件的流

主要说明下va_arg这个宏

va_arg(参数列表,读取时的类型); 大家都明白,数据在内存中都是01二进制,它的类型取决于我们怎么使用,就想printf函数中的字符串中的字符来判断怎样读取。
例如printf("%d, %c", 65, 65); 输出的结果是65, A 。

我们要向这个读取的宏指明我们要用什么方式读取它。上面的代码就是将所有的数据指明为int型。

注意事项:可变参数列表必须有一个参数指明可变参数的个数

由于要调用va_start,这个宏要指明参数的个数

大家都知道,典型的可变参数列表的例子就是printf()函数,为什么printf()没有指明参数个数,printf()会接受一个字符串,字符串中的字符就隐式的给出了参数个数,在调用va_start这个宏之前,只需要计算参数个数就可以了

2019/2/24 15:14:35

猜你喜欢

转载自blog.csdn.net/qq2071114140/article/details/87903589
今日推荐