C 可变参数

2023-05-16

 

有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C 语言为这种情况提供了一个解决方案,它允许您定义一个函数,能根据具体的需求接受可变数量的参数。下面的实例演示了这种函数的定义。

int func(int, ... )
{ . . . } 

int main() 

{ 
    func(2, 2, 3);
    func(3, 2, 3, 4); 
}

请注意,函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是 int,代表了要传递的可变参数的总数。为了使用这个功能,您需要使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:

  • 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
  • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
  • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
  • 使用宏 va_end 来清理赋予 va_list 变量的内存。

现在让我们按照上面的步骤,来编写一个带有可变数量参数的函数,并返回它们的平均值:

实例

#include <stdio.h>

#include <stdarg.h> 

double average(int num,...) 

{ 

    va_list valist; 

    double sum = 0.0;

    int i;

/* 为 num 个参数初始化 valist */

    va_start(valist, num);

/* 访问所有赋给 valist 的参数 */ 

    for (i = 0; i < num; i++)

    {
        sum += va_arg(valist, int);
    } 

/* 清理为 valist 保留的内存 */ 

   va_end(valist); 

   return sum/num;

} 

int main() 

{ 

   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5)); 

   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));

}

当上面的代码被编译和执行时,它会产生下列结果。应该指出的是,函数 average() 被调用两次,每次第一个参数都是表示被传的可变参数的总数。省略号被用来传递可变数量的参数。


Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 可变参数 的相关文章

随机推荐

  • C++知识点小结(趁热搬砖三年半的小码农) 2020年06月30日整理

    C 43 43 基础知识面试必备 复习细节 1 c 43 43 变量与基本类型 解决面试时常问的考点以及易忘点易混点 一些经验准则 xff1a 如果明确数值不为负 xff0c 则选择无符号类型使用int执行整数运算 如果超出int数值范围则
  • 经典书籍--好书很多,重要的是有个目标,有个规划

    学了才是自己的 xff0c 分享出来 xff0c 和大家一起学习 好多书我也没有看过 好书很多 xff0c 重要的是有个目标 xff0c 有个规划 操作系统方面 操作系统概念 第七版 Operating System Concepts 鸟哥
  • 使用入口函数创建多个线程

    include lt iostream gt include lt thread gt using namespace std void func int a int b cout lt lt a 43 b lt lt this threa
  • 多线程编程lock_guard 和unique_lock (第六讲)

    平时看代码时 xff0c 也会使用到std lock guard xff0c 但是std unique lock 用的比较少 在看并发编程 xff0c 这里总结一下 方便后续使用 std unique lock也可以提供自动加锁 解锁功能
  • 程序员一般都浏览这些网站,不仅仅提升编程水平!

    来源 https www zhihu com question 283272958 程序员作为一个经常和互联网打交道的人群 xff0c 他们喜欢浏览那些网站呢 xff1f 不爱敲代码的程序猿整理了以下网站供大家参考 xff0c 排名不分先后
  • 电脑编程的基础知识——编译器和连接器

    核心提示 xff1a 我从没见过 xff08 不过应该有 xff09 任何一本C 43 43 教材有讲过何谓编译器 xff08 Compiler xff09 及连接器 xff08 Linker xff09 xff08 倒是在很老的C教材中见
  • 难得的c语言经典面试题

    变量的生存期 栈和堆的区别 变量的初始化问题 传指针和传值的实质 传指针的实质是传值 传值的时候 我们是做了一个复制品 在函数中只是对复制品在操作 进入函数和返回函数都是这个道理 经历了一个复制的过程 举个例子 csdn上的一个例子 这个程
  • V2X入门知识

    根据国家统计局的数据统计 xff0c 2018年全国一共发生了24万起交通事故 xff0c 其中死亡人数有6万多人 xff0c 每天将近200人 xff0c 很多公司都在尝试通过自动驾驶 xff0c 来遏制交通事故 xff0c 避免伤亡 x
  • 车联网V2X技术要点

    初探车联网V2X技术 xff08 这个链接的内容非常不错 xff09 https www jianshu com p ecc198efdd38 随着信息技术的发展 xff0c 车联网正在从概念变为现实 xff0c 深入研究车与车 xff08
  • 智能网联V2X的秘密?解读DSRC和C-V2X两种技术

    近年来智能交通系统的开发将主要集中在智能公路交通系统领域 xff0c 也就是俗称的车联网 其中 V2X 技术借助车 车 xff0c 车与路测基础设施 车与路人之间的无线通信 xff0c 实时感知车辆周边状况进行及时预警成为当前世界各国解决道
  • NR V2X新总结

    https mp weixin qq com s a7t9fwiJOc2LCCQsqeIvUw 图片不显示 xff0c 可以看链接 自从2018年6月RAN 80全会上启动了NR V2X技术研究后 xff0c 3GPP工作组针对NR V2X
  • ADAS是什么?

    先进驾驶辅助系统 xff08 Advanced Driver Assistant System xff09 xff0c 简称ADAS xff0c 是利用安装于车上的各式各样的传感器 xff0c 在第一时间收集车内外的环境数据 xff0c 进
  • 为什么要序列化,如何序列化和反序列化?

    当两个进程在进行远程通信时 xff0c 彼此可以发送各种类型的数据 无论是何种类型的数据 xff0c 都会以二进制序列的形式在网络上传送 发送方需要把这个对象转换为字节序列 xff0c 才能在网络上传送 xff1b 接收方则需要把字节序列再
  • AD/ADAS 自动驾驶领域相关书籍整理和推荐

    本文整理了最近各方面收集的有关ADAS 智能 无人驾驶 xff08 Intelligent Driverless Driving xff09 领域的书籍资料 xff0c 这些书中不乏比较具有前瞻性的五星级书籍 xff0c 也包括技术性相关的
  • 什么是JSON?

    我有点懒 xff0c 大家耐心看图 xff0c 哈哈
  • 关于C-V2X 你需要知道的十件事

    蜂窝车联网 xff0c 通信正持续获得生态系统的支持 xff0c 将成为对汽车安全和未来自动驾驶至关重要的一项技术 在整个汽车和科技行业也都能看到C V2X技术的发展势头 举例来说 xff0c 5G汽车联盟 xff08 5GAA xff09
  • C++中的四种强制转换 dynamic_case,const_cast,static_case,reinterprer_case的不同

    使用标准C 43 43 的类型转换符 xff1a static cast dynamic cast reinterpret cast 和const cast 1 static cast 用法 xff1a static cast lt typ
  • V2X高通的布局

  • 5W2H工作法,使工作更有条理,生活更好梳理

    发明者用五个以W开头的英语单词和两个以H开头的英语单词进行设问 xff0c 发现解决问题的线索 xff0c 寻找发明思路 xff0c 进行设计构思 xff0c 从而搞出新的发明项目 xff0c 这就叫做5W2H法 xff08 1 xff09
  • C 可变参数

    有时 xff0c 您可能会碰到这样的情况 xff0c 您希望函数带有可变数量的参数 xff0c 而不是预定义数量的参数 C 语言为这种情况提供了一个解决方案 xff0c 它允许您定义一个函数 xff0c 能根据具体的需求接受可变数量的参数