C语言可变参数列表知识总结

可变参数:

C语言中的可变参数就是将函数实现成可变参数的形式,可以使函数接收一个到多个参数(不固定);

例如下面这段代码:求任意几个数的平均数(其中函数的第一个参数n表示要求n个数的平均数,求的平均数是第一个参数后面的数字的平均数,例如average (2, 1, 3)表示求1 ,3两个数的平均数):
#include 
#include 
#include 

int average(int n, ...)
{
    va_list arg;
    int i = 0;
    int sum = 0;
    va_start (arg, n);
    for (i=0; iint);
    }
    return sum/n;
    va_end (arg);
}

int main()
{
    int ret1 = average (5, 4, 5, 6, 7, 8);
    int ret2 = average (3, 4, 5, 6);
    printf ("ret1 = %d, ret2 = %d\n", ret1, ret2);
    system ("pause");
    return 0;
}

运行结果:
C语言可变参数列表知识总结_第1张图片

1、可变参数函数的原理分析:

(1)、va_list:

C语言可变参数列表知识总结_第2张图片

声明一个 va_list 型的变量 arg,也就是一个char*类型的变量, 它用于访问参数列表未确定的部分。

(2)、va_strat

这里写图片描述

_INTSIZEOF(v):

C语言可变参数列表知识总结_第3张图片

这个变量是调用 va_start 来初始化的。它的第一个参数是va_list 的变量名, 第二个参数是省略号前最后一个有名字的参数, 初始化过程把 arg 变量设置为指向可变参数部分的第一个参数。

(3)、va_arg()

C语言可变参数列表知识总结_第4张图片

为了访问参数, 需要使用 va_arg ,这个宏接受两个参数, va_list 变量和参数列表中下一个参数的类型(在上面的例子中,所有参数都是整型)。va_arg 返回这个参数的值, 并使用 va_arg 指向下一个可变参数。

(4)、va_end

C语言可变参数列表知识总结_第5张图片

当访问完最后一个参数后要调用va_end,将指针清空

最后, 可变参数的原理可以用下面一张图表示:

C语言可变参数列表知识总结_第6张图片

2、可变参数的限制:

(1)可变参数必须从头到尾逐个访问,如果你在连续访问了几个参数后想终止是可以的,但是如果你想一开始就访问到中间的参数是不行的。

(2)参数列表中,至少有一个命名参数,如果连一个命名参数都没有,就无法使用 va_start。

(3) 这些宏无法直接判断世纪存在参数的数量

(4) 这些宏无法直接判断每个参数的类型

(5) 如果在 va_arg 中指定了错误的类型,那么其后果是不可预测的

你可能感兴趣的:(c语言,C语言_学习篇)