我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C语言可变长的参数列表详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C语言可变长的参数列表详解

C语言可变长的参数列表

C语言可创建接收参数个数不确定的函数。如常用的标准库函数printf就是一个接收参数个数可变的函数。函数printf至少要接收一个字符串作为它的第一个实参。但事实上,printf还能够接收任意数目的其他实参。printf的函数原型是:

int printf(const char *format, ...);

其中的省略号(…)表示这个函数可以接收可变数目的各种类型的实参。

需要注意:这个省略号必须放在形参列表的末尾。

可变参数头文件<stdarg.h>中的宏和定义,为创建一个可变长参数列表的函数提供了必须的功能。

stdarg.h可变长参数列表类型和宏:

标识符说明
va_list该类型适合于保存宏va_start、va_arg、和va_end所需的信息。为了访问到一个可变长参数列表中的参数,必须定义一个类型为va_list的对象
va_start在一个可变长参数列表中的参数被访问前,先调用这个宏。这个宏将初始化用va_list声明的对象,以供va_arg和va_end使用
va_arg这个宏展开成一个表示可变长参数列表中下一个参数的值的表达式,值的类型由宏的第二个参数决定。每次对va_arg的调用都要修改用va_list声明的对象,以使这个对象指向列表中的下一个实参
va_end当一个函数的可变长实参列表是通过宏va_start来引用时,宏va_end可用于从这样的函数中正常返回

C11增加了宏va_copy,这个宏接受两个va_list并将第二个参数复制给第一个参数。这就允许通过可变长参数列表的多次传递不用每次都从头开始。
下面演示一个接收可变个数实参的函数average。函数average的第一个实参总是待计算平均值的数据的个数。

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

double average(int i, ...) {
	double total = 0;
	va_list ap;
	va_start(ap, i);

	for (int j = 1; j <= i; ++j) {
		total += va_arg(ap, double);
	}

	va_end(ap);
	return total / i;
}

int main() {
	double w = 37.5;
	double x = 22.5;
	double y = 1.7;
	double z = 10.2;

	printf("w = %.lf\nx = %.lf\ny = %.lf\nz = %.lf\n", w, x, y, z);
	printf("w和x的平均数:%.3f\nw、x和y的平均数:%.3f\nw、x和y和z的平均数:%.3f\n", average(2, w, x), average(3, w, x, y), average(4, w, x, y, z));
}

除了宏va_copy,函数average使用了头文件<stdarg.h>中所有的定义和宏。

上面的代码中,va_list类型的对象ap被宏va_start、va_arg和va_end用来处理函数average的可变长参数列表。

函数首先调用宏va_start来初始化对象ap,为宏va_arg和va_end使用ap做准备。

宏va_start接收两个实参——对象ap和参数列表中在省略号前的最右边的标识符,在本例中是i,宏va_start在这里使用i来判断可变长实参列表从哪里开始。

然后函数average反复地将可变长参数列表中的参数加到变量total上。通过宏va_arge,参数列表中的数据不断地被提取出来加到变量total上。

宏va_arg接收两个实参——对象ap和期望在实参列表中出现的数据的类型,在本例中是double。宏va_arg返回的是实参的值。

函数average用对象ap作为一个实参来调用宏va_end以实现从函数average正常返回到函数main中。

像printf和scanf这样带可变参数列表的函数是如何知道每个va_arg宏使用的是何种类型的数据呢?

在程序指向过程中,通过扫描格式控制字符串中的格式转换说明符来确定下一个将要出来的实参是何种类型。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C语言可变长的参数列表详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C语言可变参数与内存管理超详细讲解

有时,您可能会碰到这样的情况,您希望函数带有可变数量的参数,而不是预定义数量的参数。C语言为这种情况提供了一个解决方案,这篇文章主要介绍了C语言可变参数与内存管理
2023-01-02

Java中可变长度参数代码详解

到J2SE1.4为止,一直无法在Java程序里定义实参个数可变的方法——因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了。尽管可以通过重载机制,为
2023-05-30

C语言高级教程之变长数组详解

这篇文章主要介绍了C语言中变长数组的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-06

C语言中的可变参数怎么使用

今天小编给大家分享一下C语言中的可变参数怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、什么是可变参数我们在C语言
2023-06-08

C++ 函数的默认参数和可变参数详解

c++++ 默认参数允许为函数参数设置默认值,而在可变参数中,可以为函数提供任意数量的参数。具体而言:默认参数:允许在函数声明时为参数指定默认值,在调用时如果没有提供值则使用默认值。可变参数:使用 ... 表示,允许函数接受任意数量的参数,
C++ 函数的默认参数和可变参数详解
2024-04-19

c语言怎么定义可变长度数组

在C语言中,可以使用指针和动态内存分配来定义可变长度数组。下面是一个示例代码:```c#include #include int main() {int n; // 可变长度数组的长度int* arr; // 定义指针prin
2023-10-10

C语言中可变参数如何使用

C语言中可变参数如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、什么是可变参数我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()
2023-06-17

C语言中可变参数的原理是什么

C语言中可变参数的原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。var_list可变参数介绍VA_LIST 是在C语言中解决变参问题的一组宏,原型:typedef c
2023-06-15

C/C++宏定义的可变参数详细解析

在1999年版本的ISO C 标准中,宏可以象函数一样,定义时可以带有可变参数。宏的语法和函数的语法类似
2022-11-15

C/C++中可变参数的用法详细解析

可变参数的使用方法远远不止以下介绍的几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
2022-11-15

C++ 可变参数的语法及规则解析

c++++ 可变参数允许函数接受任意数量的参数,语法为:returntype functionname(type1 arg1, ..., typen argn, ...)。规则包括:必须放在固定参数后、只能有一个、类型必须为内置类型、类对象
C++ 可变参数的语法及规则解析
2024-04-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录