【C语言】va_list(可变参数处理)
C 语言中的 va_list 类型允许函数接受可变数量的参数,这在编写需要处理不定数量参数的函数时非常有用。va_list 类型是在 stdarg.h 头文件中定义的,它允许函数处理可变数量的参数。下面我们将详细介绍 va_list 的用法以及实际应用示例。
一、va_list的用法
va_list 是一个指向参数列表的指针,它允许函数处理不定数量的参数。va_list 类型定义如下:
typedef char* va_list;
va_list 类型通常与 va_start、va_arg 和 va_end 一起使用。下面是这些宏的简要介绍:
va_start:初始化 va_list 类型的变量,使其指向参数列表的起始位置。va_arg:获取参数列表中的下一个参数,并将指针移动到下一个参数。va_end:清理 va_list 类型的变量。
二、实际应用举例
下面我们通过一个实际的例子来演示 va_list 的使用。假设我们需要编写一个函数,计算可变数量的整数的平均值。这时就可以使用 va_list 来处理不定数量的参数。
#include <stdarg.h> // 包含标准可变参数宏的头文件
#include <stdio.h> // 包含标准输入输出的头文件// 定义一个函数,用于计算可变数量整数的平均值
double average(int count, ...)
{va_list args; // 声明一个va_list类型的变量args,用于存储可变参数列表va_start(args, count); // 初始化args,使其指向参数列表的起始位置double sum = 0; // 用于存储参数的总和for (int i = 0; i < count; i++){sum += va_arg(args, int); // 通过va_arg宏获取参数列表中的下一个参数,并将指针移动到下一个参数}va_end(args); // 清理argsreturn sum / count; // 返回参数的平均值
}int main()
{printf("Average: %f\n", average(3, 10, 20, 30)); // 调用average函数计算3个整数的平均值并打印printf("Average: %f\n", average(5, 1, 2, 3, 4, 5)); // 调用average函数计算5个整数的平均值并打印return 0;
}
在上面的例子中,average 函数接受一个整数 count 和可变数量的整数参数。它使用 va_list 来遍历参数列表,并计算这些整数的平均值。在 main 函数中,我们调用 average 函数来计算不同数量整数的平均值。
va_start宏用于初始化va_list类型的变量,va_end宏用于清理这个变量。这样做是为了确保在函数结束时释放参数列表所占用的资源,以避免内存泄漏或其他问题。
通过 va_list,我们可以轻松处理不定数量的参数,这为函数的灵活性和通用性提供了很大的帮助。
三、结语
va_list 类型是 C 语言中处理可变参数的重要工具,它允许函数处理不定数量的参数。通过 va_list,我们可以编写更加灵活和通用的函数,处理不同数量的参数。在实际开发中,va_list 常常用于实现像 printf 这样的可变参数函数,也可以用于自定义的函数,提高函数的通用性和灵活性。
希望这篇博客对你有所帮助,如果有任何问题或建议,欢迎留言交流。
相关文章:
【C语言】va_list(可变参数处理)
C 语言中的 va_list 类型允许函数接受可变数量的参数,这在编写需要处理不定数量参数的函数时非常有用。va_list 类型是在 stdarg.h 头文件中定义的,它允许函数处理可变数量的参数。下面我们将详细介绍 va_list 的用法以及实际应用示例。 一、va_list的用…...
负载均衡下的webshell连接
一、环境配置 1.在Ubuntu上配置docker环境 我们选择用Xshell来将环境资源上传到Ubuntu虚拟机上(比较简单) 我们选择在root模式下进行环境配置,先将资源文件复制到root下(如果你一开始就传输到root下就不用理会这个) …...
5-4 D. DS串应用—最长重复子串
题目描述 求串的最长重复子串长度(子串不重叠)。例如:abcaefabcabc的最长重复子串是串abca,长度为4。 输入 测试次数t t个测试串 输入样例: 3 abcaefabcabc szu0123szu szuabcefg 输出 对每个测试串,输出最…...
C语言实现12种排序算法
1.冒泡排序 思路:比较相邻的两个数字,如果前一个数字大,那么就交换两个数字,直到有序。 时间复杂度:O(n^2),稳定性:这是一种稳定的算法。 代码实现: void bubble_sort(int arr[],…...
C语言应用实例——贪吃蛇
(图片由AI生成) 0.贪吃蛇游戏背景 贪吃蛇游戏,最早可以追溯到1976年的“Blockade”游戏,是电子游戏历史上的一个经典。在这款游戏中,玩家操作一个不断增长的蛇,目标是吃掉出现在屏幕上的食物,…...
Mac如何设置一位数密码?
一、问题 Mac如何设置一位数密码? 二、解答 1、打开终端 2、清除全局账户策略 sudo pwpolicy -clearaccountpolicies 输入开机密码,这里是看不见的,输入完回车即可 3、重新设置密码 (1)打开设置-->用户和群组…...
运动编辑学习笔记
目录 跳舞重建: 深度运动重定向 Motion Preprocessing Tool anim_utils MotionBuilder 跳舞重建: https://github.com/Shimingyi/MotioNet 深度运动重定向 https://github.com/DeepMotionEditing/deep-motion-editin 游锋生/deep-motion-editin…...
C#小结:ScottPlot 5.0在VS2022桌面开发的应用(以winform为例)
目录 一、官网文档地址 二、在VS2022中安装Scottplot 三、拖动Scottplot 四、使用Scottplot 五、效果图 一、官网文档地址 官网地址:ScottPlot 5.0 食谱 本文内容来自于官网,选取了官网的一些比较好用的功能展示,如需学习更多功能&a…...
Jmeter性能测试: Jmeter 5.6.3 分布式部署
目录 一、实验 1.环境 2.jmeter 配置 slave 代理压测机 3.jmeter配置master控制器压测机 4.启动slave从节点检查 5.启动master主节点检查 6.运行jmeter 7.观察jmeter-server主从节点变化 二、问题 1.jmeter 中间请求和响应乱码 一、实验 1.环境 (1&#…...
跟着cherno手搓游戏引擎【15】DrawCall的封装
目标: Application.cpp:把渲染循环里的glad代码封装成自己的类: #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…...
Qt实现窗口吸附屏幕边缘 自动收缩
先看效果: N年前的QQ就可以吸附到屏幕边缘,聊天时候非常方便,不用点击状态栏图标即可呼出QQ界面 自己尝试做了一个糙版的屏幕吸附效果。 关键代码: void Widget::mouseMoveEvent(QMouseEvent *e) {int dx e->globalX() - l…...
shell脚本之免交互
目录 一、Here Document 免交互 1、交互与免交互的概念 2、 Here Document 概述 二、Here Document 应用 1、使用cat命令多行重定向 2、使用tee命令多行重定向 3、使用read命令多行重定向 4、使用wc -l统计行数 5、使用passwd命令用户修改密码 6、Here Document 变量…...
Ajax入门与使用
目录 ◆ AJAX 概念和 axios 使用 什么是 AJAX? 怎么发送 AJAX 请求? 如何使用axios axios 函数的基本结构 axios 函数的使用场景 1 没有参数的情况 2 使用params参数传参的情况 3 使用data参数来处理请求体的数据 4 上传图片等二进制的情况…...
蓝桥杯备战——11.NE555测频
1.分析原理图 我们可以看到,上图就是一个NE555构建的方波发生电路,输出方波频率1.44/2(R8Rb3)C,如果有不懂NE555内部结构,工作原理的,可以到B站学习。实在不懂仿真也行,比如我下面就是仿真结果: 然后就是下…...
代码随想录算法训练营第三十三天|509. 斐波那契数 ,● 70. 爬楼梯 , 746. 使用最小花费爬楼梯
确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 代码随想录 视频:从此再也不怕动态规划了,动态规划解题方法论大曝光 !| 理论基础 |力扣刷题总结| 动态规划入门_哔哩哔哩…...
Node.js 文件系统操作指南
文章目录 Node.js 文件系统操作完全指南一、引言二、基本文件操作2.1 读取文件2.2 写入文件2.3 追加内容到文件 三、文件与目录的创建与删除3.1 创建文件3.2 创建目录3.3 删除文件3.4 删除目录 四、文件与目录的信息查询4.1 检查文件或目录是否存在4.2 获取文件信息4.3 获取目录…...
Kotlin 协程1:深入理解withContext
Kotlin 协程1:深入理解withContext 引言 在现代编程中,异步编程已经变得非常重要。在 Kotlin 中,协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中,我们将深入探讨 Kotlin 协程中的一个重要函数:wi…...
(自用)learnOpenGL学习总结-高级OpenGL-几何着色器
在顶点着色器和片段着色器中间还有一个几何着色器。 几何着色器的输入是一个图元的一组顶点,在几何着色器中进行任意变换之后再给片段着色器,可以变成完全不一样的图元、可以生成更多的顶点。 #version 330 core layout (points) in; layout (line_str…...
坚持刷题 | 完全二叉树的节点个数
Hello,大家好,我是阿月!坚持刷题,老年痴呆追不上我,今天刷:完全二叉树的节点个数 题目 222.完全二叉树的节点个数 代码实现 class TreeNode {int val;TreeNode left, right;public TreeNode(int val) …...
K8S网络
一、介绍 k8s不提供网络通信,提供了CNI接口(Container Network Interface,容器网络接口),由CNI插件实现完成。 1.1 Pod通信 1.1.1 同一节点Pod通信 Pod通过虚拟Ethernet接口对(Veth Pair)与外部通信,Veth…...
从理论到实践:几何完备扩散模型GCDM在SBDD任务中的实战评测与性能剖析
1. 几何完备扩散模型GCDM的核心原理 GCDM(Geometry-Complete Diffusion Model)作为新一代3D分子生成模型,其核心创新在于解决了传统方法无法有效学习分子几何特性的痛点。想象一下搭积木的场景:普通模型只能看到积木的颜色&#x…...
SAM 3实操手册:分割掩码生成STL网格用于3D打印前处理
SAM 3实操手册:分割掩码生成STL网格用于3D打印前处理 1. 引言 你是否遇到过这样的问题:想要3D打印一个实物,但手头只有一张照片?或者想要从复杂的背景中提取出特定物体进行三维重建?传统的方法需要手动抠图、建模&am…...
Windows下OpenClaw安装指南:一键对接nanobot超轻量镜像
Windows下OpenClaw安装指南:一键对接nanobot超轻量镜像 1. 为什么选择OpenClaw nanobot组合 作为一个长期在Windows环境下折腾自动化工具的技术爱好者,我一直在寻找一个既轻量又强大的本地AI助手方案。直到遇到OpenClaw和nanobot的组合,才…...
ViGEmBus虚拟游戏手柄驱动:重构Windows输入控制生态的核心引擎
ViGEmBus虚拟游戏手柄驱动:重构Windows输入控制生态的核心引擎 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 一、价值定位:虚拟设备…...
超越矩阵SVD:T-SVD如何用傅里叶变换搞定三维数据补全?一个视频修复案例讲透
超越矩阵SVD:T-SVD如何用傅里叶变换搞定三维数据补全?一个视频修复案例讲透 当一段珍贵的历史视频出现帧丢失或噪声污染时,传统矩阵分解方法往往束手无策——它们将三维视频数据强行"压扁"成二维矩阵进行处理,破坏了时空…...
从0到1:Fugu14完美越狱工具实战指南
从0到1:Fugu14完美越狱工具实战指南 【免费下载链接】Fugu14 Fugu14 is an untethered iOS 14.3-14.5.1 jailbreak 项目地址: https://gitcode.com/gh_mirrors/fu/Fugu14 iOS 14.3-14.5.1设备如何突破系统限制?Fugu14作为一款强大的完美越狱工具&…...
5个秘诀:如何快速生成专业艺术二维码的完整指南
5个秘诀:如何快速生成专业艺术二维码的完整指南 【免费下载链接】amazing-qr 💮 amazing QRCode generator in Python (supporting animated gif) - Python amazing 二维码生成器(支持 gif 动态图片二维码) 项目地址: https://g…...
ASan实战:5种常见内存错误诊断与修复指南(附GCC/Clang编译命令)
ASan实战:5种常见内存错误诊断与修复指南(附GCC/Clang编译命令) 在C/C开发中,内存错误如同潜伏的暗礁,随时可能让程序沉没。AddressSanitizer(ASan)作为Google推出的内存错误检测工具ÿ…...
Hunyuan-MT Pro详细步骤:本地启动http://localhost:6666翻译终端
Hunyuan-MT Pro详细步骤:本地启动http://localhost:6666翻译终端 1. 快速了解Hunyuan-MT Pro Hunyuan-MT Pro是一个基于腾讯混元开源模型构建的现代化翻译工具,它把强大的AI翻译能力包装成了一个简单易用的网页应用。你不需要懂复杂的技术,…...
从国赛真题到实战演练:蓝桥杯CTF网络安全竞赛核心题型深度剖析
1. 逆向工程实战:从加密程序到Flag还原 去年蓝桥杯CTF国赛的第一道逆向题让不少选手印象深刻。题目给出一个名为encodefile的可执行程序和一个加密后的数据文件enc.dat,要求还原原始flag内容。这类题型在CTF中非常典型,主要考察选手对程序逻辑…...
