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

可变参数:

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

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

int average(int n, ...)
{
    va_list arg;
    int i = 0;
    int sum = 0;
    va_start (arg, n);
    for (i=0; i<n; i++)
    {
        sum += va_arg(arg, int);
    }
    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;
}

运行结果:
这里写图片描述

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

(1)、va_list:

这里写图片描述

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

(2)、va_strat

这里写图片描述

_INTSIZEOF(v):

这里写图片描述

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

(3)、va_arg()

这里写图片描述

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

(4)、va_end

这里写图片描述

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

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

这里写图片描述

2、可变参数的限制:

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

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

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

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

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

猜你喜欢

转载自blog.csdn.net/a__b__c__/article/details/80240736
今日推荐