“可变参数列表”的学习

最近,学习了“可见参数列表”,忽然之间发现很喜欢它,哈哈~

现在,我们来谈谈它吧!
功能: 可以将函数以可见参数列表的形式实现,使得函数可以接受1个以上的任意多个参数。
应用:要使用可变参数列表,我们要对其原理及用法十分了解!
(1)要引用的头文件被封装在“stdarg.h“中。
(2)在应用时,首先,声明一个 va_list类型的变量 arg ,它用于访问参数列表的没有确定的部分,比如几个变量,什么类型等。
( 3 ) 初始化,变量arg是调用 va_start 来初始化的。它的第一个参数是 va_list 的变量名,第2个参数是省略号前最后一个有名字的参数。初始化过程把 arg 变量设置为指向可变参数部分的第一个参数。
( 4 )参数访问,为了访问参数,需要使用 va_arg ,这个宏接受两个参数: va_list 变量和参数列表中下一个参数的类型。
(5)最后,当访问完毕最后一个可变参数之后,我们需要调用 va_end 结束访问。
但应用可变参数列表是有限制的,
可变参数的限制:
注意:
(1)可变参数必须从头到尾逐个访问。如果访问了几个可变参数之后要
终止,这是可以的,但是,不能从一开始就访问参数列表中间的参数。
(2)参数列表中至少有一个命名参数。如果连一个命名参数都没有,就无法使用va_start。
(3)这些宏是无法直接判断实际存在参数的数量,且类型必须指定正确。
(4)这些宏无法判断每个参数的类型。

下面举个例子,用可变参数列表实现函数功能:两个整数比较大小。

#include<stdio.h>
#include<stdarg.h>     //头文件
int Max(int n,...)     //未知的参数
{
    va_list arg;       //创建可变参数列表的变量
    int max = 0;
    int i = 0;
    va_start(arg,n);    //初始化
    max = va_arg(arg,int);     //访问变量

    for(i = 0; i<n-1; i++)
    {
        int tmp =va_arg(arg,int);
        if(max <tmp)
        {
            max =tmp;

        }
    }
    va_end(arg);
    return max;

}
int main()
{
    int a = 0;
    int b = 0;
    scanf("%d %d",&a,&b);
    printf("%d\n",Max(2,a,b));
    return 0;
}

这里写图片描述

在发现用可变参数列表实现了个简单的函数功能时,感觉还是不错的哇~

下面,转到源码看看:

typedef char *  va_list;
#endif /* _M_CEE_PURE */
#define _VA_LIST_DEFINED
#endif
#elif   defined(_M_IX86)

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

#define _crt_va_start(ap,v)  ( ap = (va_list)_ADDRESSOF(v) + _INTSIZEOF(v) )
#define _crt_va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define _crt_va_end(ap)      ( ap = (va_list)0 )

分析看看:
这里写图片描述

 了解了源码的基本的过程,再返回头看上面写过的代码,理解的会更深入!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值