变参函数的深度解析(通俗易懂)

本文深入探讨了C语言中的变参函数,解释了如何定义和使用它们。通过讲解va_list、va_start、va_arg和va_end等宏的作用,以及变参函数的实现原理,提供了多个示例来展示变参函数的实际应用,如IntegerVarArgFunc、ParseVarArgByNum和ParseVarArgByEnd。最后,介绍了一个简易的MyPrintf函数,展示了如何自定义类似printf的变参函数。
摘要由CSDN通过智能技术生成

可变参数函数的定义:
可变参数函数又称参数个数可变函数(本文也简称变参函数),即函数参数数目可变。其中,参数可分为两部分:数目确定的固定参数和数目可变的可选参数。函数至少需要一个固定参数,其声明与普通函数参数相同;可选参数由于数目不定(0个或以上),声明时用"…"表示(“…”用作参数占位符)。固定参数和可选参数共同构成可变参数函数的参数列表。
可变参数函数的原型:
type VarArgFunc(type FixedArg1, type FixedArg2, …);
关于变参函数几个重要的宏定义:
1、typedef char *va_list;把char *类型的指针,重命名为va_list
2、va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数(也就是最后一个固定参数))
#define va_start(list,param1) ( list = (va_list)&param1+ sizeof(param1) )
3、va_arg宏,获取可变参数的当前参数和返回指定类型,并将指针指向下一参数(返回左移的值 [-1] (数组下标表示偏移量),即当前变参值)(type参数描述了当前参数的类型):
#define va_arg(list,type) ( (type *) ( list += sizeof(type) ) )[-1]
4、va_end宏,清空va_list可变参数列表:
#define va_end(list) ( list = (va_list)0 )
总结:va_list定义指针类型,va_start使指针指向第一个可变参数,va_arg获取当前参数,并将指针指向下一个参数,va_end清空指针,是指针不再指向有效的内存。
变参函数实现原理:

#include <stdarg.h>
int VarArgFunc(int dwFixedArg, ...)

{
   
    va_list pArgs = NULL;  //定义va_list类型的指针pArgs并初始化,用于存储参数地址
    va_start(pArgs, dwFixedArg); //使其指向第一个可变参数。该宏第二个参数是最后一个固定参数
    int dwVarArg = va_arg(pArgs, int); //返回变参列表中的当前变参值并使pArgs指向列表中的下个变参。该宏第二个参数是要返回的当前变参类型
    //若函数有多个可变参数,则依次调用va_arg宏获取各个变参
    va_end(pArgs);  //将指针pArgs置为无效,结束变参的获取
}

变参函数使用代码举例:
eg1:函数接受一个整型固定参数和一个整型可变参数,并打印这两个参数值。

void IntegerVarArgFunc(int i, ...){
   
    va_list pArgs = NULL;
    va_start(pArgs, i);
    int j = va_arg(pArgs, int);
    va_end(pArgs);
    printf("i=%d, j=%d\n", i, j);
}

分别采用以下三种方法调用
1) IntegerVarArgFunc(1);
输出i=1, j=6803972(形参i的堆栈上方内容
2) Inte

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值