C语言函数可变参数教程

可变参数的函数必须至少有一个强制参数,可选参数的类型可以变化。可选参数的数量由强制参数的值决定,或由用来定义可选参数列表的特殊值决定。

对于每一个强制参数来说,函数头部都会显示一个适当的参数,像普通函数声明一样。参数列表的格式是强制性参数在前,后面跟着一个逗号和省略号(…),这个省略号代表可选参数。

C语言函数可变参数详解

语法

type funcName(paramType1 param1, ...){

// 执行语句...

return val

}

参数

参数

描述

type

函数的返回值类型,如果没有任何返回值,则写 void,不可以死省略不写。

funcName

函数名。

paramType1

函数参数 param1 的类型

param1

函数参数

可变参数,即可以传递任何类型和个数的参数

return

可选,函数返回值使用的关键字。

val

函数需要具体返回的值。

说明

定义可变参数必须要有一个强制参数,这里的参数 param1 就是强制参数,最后的 ... 表示的是可变参数。

C语言函数可变参数使用

可变参数函数要获取可选参数时,必须通过一个类型为 va_list 的对象,它包含了参数信息。这种类型的对象也称为参数指针(argument pointer),它包含了栈中至少一个参数的位置。

可以使用这个参数指针从一个可选参数移动到下一个可选参数,由此,函数就可以获取所有的可选参数。va_list 类型被定义在头文件 stdarg.h 中。

当编写支持参数数量可变的函数时,必须用 va_list 类型定义参数指针,以获取可选参数。当我们处理可变参数时,主要涉及到以下几个宏函数:

va_start

语法

void va_start(va_list argptr, lastparam);

参数

参数

描述

argptr

定义好的 va_list 变量。

lastparam

强制参数。

说明

宏 va_start 使用第一个可选参数的位置来初始化 argptr 参数指针。该宏的第二个参数必须是该函数最后一个有名称参数的名称。必须先调用该宏,才可以开始使用可选参数。

va_arg

语法

type va_arg(va_list argptr, type);

参数

参数

描述

argptr

定义好的 va_list 变量。

type

可变参数的具体类型。

说明

展开宏 va_arg 会得到当前 argptr 所引用的可选参数,也会将 argptr 移动到列表中的下一个参数。宏 va_arg 的第二个参数是刚刚被读入的参数的类型。

va_end

语法

void va_end(va_list argptr);

参数

参数

描述

argptr

定义好的 va_list 变量。

说明

当不再需要使用参数指针时,必须调用宏 va_end。如果想使用宏 va_start 或者宏 va_copy 来重新初始化一个之前用过的参数指针,也必须先调用宏 va_end。

va_copy

语法

void va_copy(va_list dest, va_list src);

参数

参数

描述

dest

目的 va_list 变量。

src

源 va_list 变量。

说明

宏 va_copy 使用当前的 src 值来初始化参数指针 dest。然后就可以使用 dest 中的备份获取可选参数列表,从 src 所引用的位置开始。

案例

函数可变参数

用函数可变参数,实现求任意变量的和

#include

#include

int mulSum(int n, ...){

int i = 0;

int sum = 0;

va_list argptr;

va_start(argptr, n); // 初始化argptr

for (i = 0; i < n; i++) // 对每个可选参数,读取类型为int

{

sum += va_arg(argptr, int); //累加到 sum 中

}

va_end(argptr);

return sum;

}

int main(){

printf("嗨客网(www.haicoder.net)\n\n");

int mulSumRet = mulSum(4, 1, 3, 5, 8);

printf("mulSumRet = %d\n", mulSumRet);

return 0;

}

程序运行后,控制台输出如下:

我们定义了一个函数 mulSum,该函数的第一个参数是一个 ... 表示是可变参数。

接着,我们使用该可变参数,实现了求出我们传入的所有数的和。

C语言函数可变参数总结

C 语言中函数的参数是支持可变参数的,即函数参数的个数是任意的。C 语言中的函数的可变参数主要依靠 va_start、va_arg 和 va_end 来实现的。

c语言 函数多个参数,C语言函数可变参数相关推荐

  1. ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数

    ​Swift语言中为外部参数设置默认值可变参数常量参数变量参数输入输出参数 7.4.4  为外部参数设置默认值 开发者也可以对外部参数设置默认值.这时,调用的时候,也可以省略参数传递本文选自Swift ...

  2. python 可变参数 关键字参数_Python关键字及可变参数*args,**kw原理解析

    可变参数 顾名思义,函数的可变参数是传入的参数可以变化的,1个,2个到任意个.当然可以将这些 参数封装成一个 list 或者 tuple 传入,但不够 pythonic.使用可变参数可以很好解决该问题 ...

  3. java的可变参数介绍_Java基础 可变参数介绍(转载)

    本文章转载自:潜龙在渊的博客 一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型...(三个点) 例如: void printArray(Object...) 注 ...

  4. c语言宏不能传递参数,关于c ++:可变参数宏:不能通过’…’传递非平凡复制类型的对象...

    我正在尝试为日志记录机制编写宏. 我编写了一个可变参数宏,但它不适用于std::string. 该代码如下所示: #include #include #define LOG_NOTE(m, ...) ...

  5. python可变参数的特点_可变参数**kwargs传入函数时的存储方式为( )_学小易找答案...

    [单选题]抗结核药联合用药的目的是: [单选题]女性,50岁,患耐青霉素的金葡菌性心内膜炎,青霉素试敏阴性,既往有慢性肾盂肾炎,应选用: [填空题]固态下原子(或分子)呈( )排列而形成的聚集状态,称 ...

  6. oracle 函数可变参数,6.3 带有可变参数的函数

    6.3 带有可变参数的函数 在以前的实现中,不能指定函数预期的参数类型,但 ISO C 鼓励您使用原型执行该操作.为支持诸如 printf() 之类的函数,原型语法包括特殊的省略号(-) 终结符.由于 ...

  7. 什么是可变参数列表?以及可变参数列表是如何实现的?

    1.首先什么是可变参数列表? 对于一般的函数而言,参数列表都是固定的,而且各个参数之间用逗号进行分开.这种函数在调用的时候,必须严格按照参数列表中参数的个数进行传参,否则编译器就会报错. int ad ...

  8. java 可变参数列表 数组_java可变参数列表如何填充数组?

    在对于数组的填充上,我们可以运行参数的传递,把数组作为可变参数的列表进行调整.对于一些参数个数和类型未知的时候,这种方法就能帮助我们解决填充数组的难题,因为这种方法并不需要提前知道.下面我们就可变参数 ...

  9. java 可变参数列表_java的可变参数列表

    关于java的可变参数列表 1.简介: java的可变参数列表是的从jdk1.5开始新增的,其英文名词varargs 2.作用 可以传未知个数的参数,无需手动将参数列表装入数组 3.语法 //可变参数 ...

  10. java 可变参数列表_java中可变参数列表的实现方法

    我们在对可变参数有一定的认识后,可以引申一下它的使用范围.在数组中也会需要参数的传入,那么结合参数的数量不固定,我们在参数类型上也得到了增加,这就是本篇所要讲的可变参数列表.下面我们就java可变参数 ...

最新文章

  1. setInterval动态时间处理
  2. 服务外包技术培训——后端开发技术栈分析(Java)
  3. linux who命令测试,Linux中的who命令详细示例
  4. 关于Spring AOP代理的生成过程
  5. 哪种代理适合用于Web数据采集
  6. 《2018中国区块链行业分析报告》(50页PPT全文)
  7. Web前端基础---JavaScript函数事件及其绑定DOM模型BOM模型
  8. html滚动条怎么置顶,js控制滚动条到最底端(置底)和最顶端(置顶)
  9. mysql 安装、建库、导入导出数据
  10. 厉害,刚刚官方宣布 IntelliJ IDEA 2020.2 EAP4发布了!
  11. SVN 创建分支,分支与主干的合并
  12. (JAVA)韩顺平老师讲的房屋出租系统
  13. 大数据分析-实验五 pdfminer
  14. 什么是架构?架构师的职责是什么?
  15. 关于offer、三方协议、福利等就业常识
  16. 微信小程序ssm电影院购票+后台管理系统|前后分离VUE
  17. 库克放大招啦!一张照片生成3D头像,新模型击败StyleGAN2!
  18. Vim文本编辑器及文本处理常用操作
  19. 成都榆熙:举报评价一般几个工作日被审核?
  20. Word 2016 撰写论文(3): 文献中常见的表格(三线表)制作

热门文章

  1. PHP的max_execution_time
  2. mac编译php apache,在Mac OS上自行编译安装Apache服务器和PHP解释器
  3. 互为质数的勾股数c语言,c语言 寻求勾股数满足x2+y2=z2的正整数x,y和z称为一组勾股数(pythagorean...
  4. java 语法 冒号_java中生僻的冒号跳转语法
  5. win10 mysql 远程连接_win10 docker部署mysql并启动远程连接
  6. stm8s003程序跑飞_微信小程序只玩跳一跳?OUT啦!带你玩更好玩的微信小游戏!...
  7. 数据更新播报php程序,使用thinkPHP实现数据更新一例【原创】
  8. matlab 主成分 分类,matlab主成分分析
  9. python执行shell脚本、执行mongodb_Mongo shell 的基本操作和 Python shell 中使用 MongoDB...
  10. html js css如何关联_html+css +js 选项卡