C C++最全C语言中可变参函数介绍与示例_c语言可变参数示例,小白以及计算机类学生的福音

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

nNum是可变参函数的最后一个确定的参数,va_start使vap指向第一个可选参数。

2)然后使用va_arg宏返回参数列表中的当前参数,并使vap指向参数列表中的下一个参数,如下:

va_arg(vap, int);

在调用宏va_arg时必须提供有关实参的实际类型(如本例中的int),这一类型也将成为这个宏调用的返回值类型。

3)在使用va_arg宏获取了所有的实参之后,最后使用va_end宏把vap指针清为NULL,如下:

va_end(vap);

我们在函数体内可以多次遍历这些由vap代表的实参,但是都必须以va_start开始,并以va_end结尾。

3. demo演示

3.1 demo1

需求:我们想定义一个函数sum,该函数可以有任意多个整型参数,函数sum最终返回这些参数的和。

我们应该将sum函数定义为一个只有一个普通参数、并具有可变长度参数表的函数,这个函数的头部应该是(函数原型与此类似):

int sum(int n, ...)

实际上我们要求在调用该函数时,第一个参数n代表想要求和的参数个数,而其余的参数为将要进行求和的参数。

完整代码(variable_arg.c)如下:

#include <stdio.h>
#include <stdarg.h>

int sum(int nNum, ...)
{
    va_list vap;
    int nSum = 0;
    int i;

    va_start(vap, nNum);
    for (i = 0; i < nNum; i++)
    {
        nSum += va_arg(vap, int);
    }
    va_end(vap);

    return nSum;
}

int main()
{
    int nSumValue = 0;

    nSumValue = sum(3, 10, 11, 19);

    printf("nSumValue is: %d\n", nSumValue);

    return 0;
}

编译后,运行该程序,运行结果如下:

上述结果显示可变参函数sum满足了我们的需求。

3.2 demo2

需求:使用可变参函数,将可变个数的字符串参数打印出来。

我们应该将demo函数定义为一个只有一个普通参数、并具有可变长度参数表的函数,这个函数的头部应该是(函数原型与此类似):

int demo(char* msg, ...)

我们在调用该函数时,会将除msg外的其余的参数打印出来,同时需要注意,在实际调用这个函数时,要通过一定的方法指明实际参数的个数,例如把最后一个参数置为空字符串(本例采用此种方式)或其他的方式。

完整代码(variable_arg2.c)如下:

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

/* 函数原型声明,至少需要一个确定的参数,注意括号内的省略号*/
int demo(char*, ...);

int main()
{
    demo("DEMO", "This", "is", "a", "demo!", "");
}

/* ANSI标准形式的声明方式,括号内的省略号表示可选参数 */
int demo(char *msg, ...)
{
    /* 定义保存函数参数的结构 */
    va_list argp;

    /* 记录参数个数 */


![img](https://img-blog.csdnimg.cn/img_convert/738ce6ffbfa4a90c6ebdf0bed6118fa2.png)
![img](https://img-blog.csdnimg.cn/img_convert/a11bfb4ecf64325bd6db4bc2b9448174.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

+开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值