c语言基于stdarg.h的可变参数函数的用法

发布时间 - 2026-01-11 02:25:07    点击率:

C语言编程中有时会遇到一些参数个数可变的函数,本文详细讲解了可变参数函数的实现原理,分享给大家

在开始学习C语言的函数的时候,我们就知道函数的参数个数应该是在函数声明的时候就指定的,这一点我们没有任何疑问。但是不知道大家有没有注意到我们的printf()函数,他的函数参数理论上并不是确定的,而是随着匹配字符串中的格式控制符的个数控制的。其实当时也没有注意到这一点,到是最近,偶然间看到了 《嗨翻C语言》 这本书,这里就详细讲解了这种可变参数函数的实现原理,今天考试间隙就顺带学习了一下,其实就是一种方法,知道了就晓得了,也是非常的简单。

头文件

这个用法需要引用一些宏,这些宏定义在C标准库“stdarg.h”中,(当然C++中就是“cstdarg”了)。

函数声明

int fun(int arg1,int arg2, ...){
//foo
}


这里可以用普通传参方法传入几个固定参数,一般情况下会有个表示可变参数的个数(否则函数也不晓得你到底传给了他啥),最后表示可变参数部分的是三个连续的点,注意中间不能有空格。我们传入的可变参数就是在这里的。

具体用法

这里主要涉及到va_list类型,va_start()、va_arg()、va_end()这几个函数。

va_list 可以理解为以链表的形式保存那些可变参数的一个数据类型(既然是链表,当然是可变的了)。

void va_start(va_list ap , int len); 接受两个参数,一个是上面的那个东西,还有一个表示数据的数目。目测可以理解为是自动收集传给本函数的可变参数,并连带他的数目,将信息赋给 va_list 。

type va_arg(va_list ap , type ); 接受两个参数,一个是va_list,另一个是保存的数据的类型。因为在调用参数的时候,编译器不会检查实际输入的是什么参数,所以需要适时的指定,并以那个类型返回。注意,这时候在va_list中的某个指针会指向下一个元素,所以下一次调用时输出的值就是下一个元素。在这一点上用法类似于iterator。

void va_end(va_list ap);最后清理这个va_list.

演示源码

#include<stdarg.h>
#include<stdio.h>
void print(intarg,...){
 va_list ap;
 va_start(ap, arg);
 for (int i = 0; i < arg; i++){
 printf("%d ", va_arg(ap,int));
 }
 va_end(ap);
}
int main(){
 print(4, 1, 2, 3, 4);
}

结果自然是输出 1 2 3 4。

说明

虽然看上去效果很酷,但是实际上据说这种用法的确很不安全,容易造成运行错误,所以还是尽量要少用。这种类似的问题如果能用重载或者类来解决的话还是少用可变参数函数吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# c  # 可变参数函数  # c语言可变参数函数  # C语言的可变参数函数实现详解  # C语言中编写可变参数函数  # C语言可变参数函数详解示例  # C语言container of()函数案例详解  # C语言可变参数函数详解  # 的是  # 注意到  # 链表  # 几个  # 也不  # 是在  # 在这里  # 有个  # 没有任何  # 可以用  # 中有  # 下一  # 给大家  # 还有一个  # 这本书  # 并以  # 你到底  # 涉及到  # 这几个  # 理论上 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Laravel如何与Pusher实现实时通信?(WebSocket示例)  Laravel如何创建自定义中间件?(Middleware代码示例)  php 三元运算符实例详细介绍  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  Swift中switch语句区间和元组模式匹配  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  JS弹性运动实现方法分析  如何在橙子建站中快速调整背景颜色?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Python高阶函数应用_函数作为参数说明【指导】  如何快速搭建自助建站会员专属系统?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  如何快速辨别茅台真假?关键步骤解析  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  如何注册花生壳免费域名并搭建个人网站?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  公司网站制作价格怎么算,公司办个官网需要多少钱?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Android GridView 滑动条设置一直显示状态(推荐)  微信小程序 配置文件详细介绍  如何用虚拟主机快速搭建网站?详细步骤解析  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  青岛网站建设如何选择本地服务器?  Laravel怎么上传文件_Laravel图片上传及存储配置  EditPlus中的正则表达式实战(6)  Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  Laravel如何生成API文档?(Swagger/OpenAPI教程)  中山网站制作网页,中山新生登记系统登记流程?  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Laravel如何与Docker(Sail)协同开发?(环境搭建教程)  如何在IIS管理器中快速创建并配置网站?  Laravel API资源类怎么用_Laravel API Resource数据转换  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何破解联通资金短缺导致的基站建设难题?  创业网站制作流程,创业网站可靠吗?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel的辅助函数有哪些_Laravel常用Helpers函数提高开发效率  MySQL查询结果复制到新表的方法(更新、插入)