可变参数列表源码的剖析。

  我们先来看一段代码。利用可变参数来求一段数据的最大值。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<assert.h>
int maximum(int num, ...)
{
    va_list max1;
    int i = 0;
    int Max = 0;
    va_start(max1, num);
    for (i = 0; i < num; i++)
    {
        int M = va_arg(max1, int);//取所在的值的下一个值,即第一个值和第二个值(num=2时候)
        Max = Max>M ? Max : M;//利用?操作符比较。
    }
    return Max;
    va_end(max1);
}
int main()
{
    int a = 0;
    int b = 0;
    int c = 0;
    int d = 0;
    printf("请输入a,b,c,d的值:>");
    scanf("%d %d %d %d", &a, &b, &c, &d);
    printf("
");
    int max1 = maximum(2, a, b);
    int max2 = maximum(3, a, b, c);
    int max3 = maximum(4, a, b, c, d);
    printf("两个数,三个数,四个数最大值分别为:>%d,%d,%d
", max1, max2, max3);
    return 0;
}

  可以很清楚的看到,我们在定义maximum函数的时候,用到了可变参数“...”,这里就需要提及四个用到的宏——

  va_list:用于定义变量,用于访问参数列表未确定的部分(即“...”的内容)

  va_start:用于初始化变量,其第一个参数是va_list定义的变量,第二个参数是省略号前最后一个有名字的参数。上面代码初始化过程是把arg变量设置为指向可变参数部分的第一个参数(例如"int max1 = maximum(2, a, b);"中的‘a’)。

  va_arg:用于取arg后一个参数的地址,它有两个参数,一个是va_list定义的变量,还有一个是下一个参数的类型。(这里就又提到宏和函数的区别了,因为va_arg可以把类型当做参数,可见其为宏不是函数。)

  va_end:用于结束调用,防止生成野指针。(个人理解就是释放了这个定义的变量(自己猜的))。

感谢审阅。

原文地址:https://www.cnblogs.com/shy0322/p/7814506.html