C语言函数不定参数实现方式

2023-10-26

函数如何实现不定参数:由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。


(1)va_list

定义了一个指针arg_ptr, 用于指示可选的参数.

(2)va_start(arg_ptr, argN)
使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va
函数的声明是void va_test(char a, char b, char c, ...), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start
(arg_ptr, c).

(3)va_arg(arg_ptr, type)
返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.

(4)va_end(arg_ptr)
清空参数列表, 并置参数指针arg_ptr无效.
(注:va在这里是variable-argument(可变参数)的意思.   这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件)

 

以下以几个栗子来说明情况:

例1:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdarg.h>
 4 
 5 int print(const char *format, ...)
 6 {
 7     va_list args;
 8     const char *args1;
 9     va_start(args, format);
10     args1 = va_arg(args,const char *);
11     va_end(args);
12     printf("format=%s args1=%s", format, args1);
13 }
14 int main()
15 {
16     print("11111", "22222");
17 }

运行结果:

1 /*
2 format=11111 args1=22222
3 Process returned 24 (0x18)   execution time : 0.542 s
4 Press any key to continue.
5 */

 

例2:

 1 例2:
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <stdarg.h>
 5 
 6 int print(const char *format, ...)
 7 {
 8     va_list args;
 9     const char *args1;
10     va_start(args, format);
11     args1 = va_arg(args,const char *);
12     va_end(args);
13     printf("format=%s args1=%s", format, args1);
14 }
15 
16 int main()
17 {
18     print("11111", "22222", "333333");
19 }

运行结果:

1 /*
2 format=11111 args1=22222
3 Process returned 24 (0x18)   execution time : 0.542 s
4 Press any key to continue.
5 */

我们从上面可以看见这样在函数中加入三个参数是没有问题的;

 

 

例3:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdarg.h>
 4 
 5 int print(const char *format, ...)
 6 {
 7     va_list args;
 8     const char *args1;
 9     va_start(args, format);
10     args1 = va_arg(args, const char *);
11     args2 = va_arg(args, const char *);
12     va_end(args);
13     printf("format=%s args1=%s", format, args1, args2);
14 }
15 
16 
17 int main()
18 {
19 
20     print("11111", "23333");
21 }

运行结果:

1 /*
2 format=11111 args1=23333
3 Process returned 24 (0x18) execution time : 0.153 s 4 Press any key to continue. 5 6 */

注意是上面并没有三个参数,但是程序还是可以运行起来的! 

 

 

从上面三个例子可以看出我们传入的参数都是一个类型的参数;

 

例4:

 不同类型的函数参数:

 1 int print(const char *format, ...)
 2 {
 3     va_list args;
 4     int args1;
 5     va_start(args, format);
 6     args1 = va_arg(args, int);
 7     va_end(args);
 8     printf("format=%s args1=%d", format, args1);
 9 }
10 
11 
12 int main()
13 {
14 
15     print("11111", 123);
16 }

运行结果:

1 /*
2 format=11111 args1=123
3 Process returned 22 (0x16)   execution time : 0.007 s
4 Press any key to continue.
5 */

 

 


但是注意不能使用:
总之,va_arg(ap,type)中的type绝对不能为以下类型:
——char、signed char、unsigned char
——short、unsigned short
——signed short、short int、signed short int、unsigned short int
——float

 

转载于:https://www.cnblogs.com/linhaostudy/p/6695422.html

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

C语言函数不定参数实现方式 的相关文章

  • Python中RotatingFileHandler、TimedRotatingFileHandler函数用法

    欢迎来到我的博客 作者 秋无之地 简介 CSDN爬虫 后端 大数据领域创作者 目前从事python爬虫 后端和大数据等相关工作 主要擅长领域有 爬虫 后端 大数据开发 数据分析等 欢迎小伙伴们点赞 收藏 留言 背景 在python开发过程中
  • Linux如何卸载软件

    Linux系统可以通过终端 Terminal 或图形界面 GUI 来卸载软件 终端方式可以使用apt get Ubuntu 或yum CentOS 命令来实现 而图形界面方式可以使用系统自带的软件管理器来实现 比如Ubuntu的Ubuntu
  • libev学习系列之二:libev下载

    libev学习系列之二 libev下载 版本说明 版本 作者 日期 备注 0 1 ZY 2019 5 31 初稿 目录 文章目录 libev学习系列之二 libev下载 版本说明 目录 官网 GitHub 我的某度网盘 官网 可以去官网下载
  • 【python练习题 03】高矮个子排队

    题目 现在有一队小朋友 他们高矮不同 我们以正整数数组表示这一队小朋友的身高 如数组 5 3 1 2 3 我们现在希望小朋友排队 以 高 矮 高 矮 顺序排列 每一个 高 位置的小朋友要比相邻的位置高或者相等 每一个 矮 位置的小朋友要比相
  • Date:January 29th Title: 集训Day2-小信小友打怪兽 题解

    时间 1s 空间 256M 题目描述 小信与小友一起组队打怪兽 有一个长度为n的怪兽序列 一些怪兽会对小信造成伤害 另一些不会 小友是大佬 所有怪兽都伤害不了他 小信与小友轮流打怪兽 小信先手 小友后手 他们需要按照顺序打怪兽 由于技能有冷
  • 小米盒子3s刷机为国际版系统android TV 8.0

    小米盒子3s刷机为国际版系统android TV 8 0 所需工具和软件 一个U盘 adb工具 使用adb工具 通过ip连接小米盒子 官方下载地址 点此进入 dump 16AB img MiBOX3S queenchristina r145
  • tera-PROMISE数据集

    tera Promise数据集 原网址 http openscience us repo 已经打不开 备份网址 https github com opensciences opensciences github io 来源 论文An Imp
  • 蓝桥杯历届试题——取球游戏(博弈论)

    取球游戏 今盒子里有n个小球 A B两人轮流从盒中取球 每个人都可以看到另一个人取了多少个 也可以看到盒中还剩下多少个 并且两人都很聪明 不会做出错误的判断 我们约定 每个人从盒子中取出的球的数目必须是 1 3 7或者8个 轮到某一方取球时
  • 文件对应的Content-Type类型

    https www cnblogs com liu heng p 7520564 html CONTENT TYPE load text html 123 application vnd lotus 1 2 3 3ds image x 3d
  • 海思Hi3559A平台移植 opencv4.0.0

    原文 https blog csdn net xclshwd article details 85257117 海思Hi3559A平台移植 opencv4 0 0 2018年12月26日 09 51 53 xclshwd 阅读数 370 版
  • Jetpack学习之WorkManager

    绝大部分应用程序都有在后台执行任务的需求 根据需求的不同 Android为后台任务提供了多种解决方案 如JobScheduler Loader Service等 WorkManager为应用程序中那些不需要及时完成的任务提供了一个统一的解决
  • 基于MATLAB的图像压缩感知

    一 课题背景 数据压缩技术是提高无线数据传输速度的有效措施之一 传统的数据压缩技术是基于奈奎斯特采样定律进行采样 并根据数据本身的特性降低其冗余度 从而达到压缩的目的 近年来出现的压缩感知理论 Compressed Sensing CS 则
  • 将参数字符串中的字符反向排列,不是逆序打印。

    小题分享 定义一个字符串 abcdef 封装一个函数使他反向排列 不是逆序打印 我们很容易就能想到一种方法 采用循环的方式互换首尾的元素 void reverse char str int left 0 int right strlen s
  • 廊坊师范学院IT提高班,你真正了解多少?

    最近在csdn博文中经常看到博友们问 什么是提高班 更有人对提高班怀有疑惑 or 不理解 廊坊师范学院信息技术提高班到底是怎样的一个地方 你对这个地方又有怎样的认识 你对这个地方是否怀有一份好奇心呢 让这篇文章解开你心中的某些疑惑吧 我一个
  • Node.js使用session或JWT机制登录验证教程

    Session实现代码 Session 对象存储特定用户会话所需的属性及配置信息 这样 当用户在应用程序的 Web 页之间跳转时 存储在 Session 对象中的变量将不会丢失 而是在整个用户会话中一直存在下去 当用户请求来自应用程序的 W
  • 小程序中实现点击切换不同组件的效果

    前言 小程序中实现点击切换不同页面的组件效果 实现效果 实现步骤 第一 分别建立三个页面的文件夹以及他们的相关文件 第二 index模块中 index wxml
  • 安装APK的两种方式

    我的新书 Android App开发入门与实战 已于2020年8月由人民邮电出版社出版 欢迎购买 点击进入详情 网络安装 一般通过网线连接到设备 通过网线进行apk的传输和安装 步骤如下 1 adb connect 目标设备ip和端口 2
  • C++中long是什么类型

    long long本质上还是整型 只不过是一种超长的整型 int型 32位整型 取值范围为 2 31 2 31 1 long 在32位系统是32位整型 取值范围为 2 31 2 31 1 在64位系统是64位整型 取值范围为 2 63 2
  • AIGC基础:从VAE到DDPM原理、代码详解

    作者 王建周 单位 来也科技AI团队负责人 研究方向 分布式系统 CV NLP 前言 AIGC 目前是一个非常火热的方向 DALLE 2 ImageGen Stable Diffusion 的图像在以假乱真的前提下 又有着脑洞大开的艺术性
  • 我们真的需要复杂的密码吗?

    目录 toc 现状 想写这篇文章很久了 不过作为一个安全行业的从业者 总觉得说出来有些汗颜 我们这个行业的安全人员总是引导甚至强制灌输人们设置复杂密码的做法 让我一直觉得写这篇文章是在对我们的自我否定 自我打脸 所以也就一直没有写 直到我的

随机推荐

  • 元宇宙概念火热,多家企业推出NFT

    摘要 产业动态 Facebook 计划未来五年在欧洲招聘 1 万人建立元宇宙 新加坡新跃社科大学成立元宇宙实验室 淘宝APP上线 天猫双11首届元宇宙艺术展 格拉斯哥大学与VB Hyperledger合作启动Moshan区块链实验室 政策相
  • Robotium学习笔记三

    以下是从网络上抄录的一些Robotium注意事项 1 有些button没有string 没有text 只能通过index来click这样很不直观 而且button的index并不是固定的 有可能随着控件重新加载 顺序也有可能发生变化 无法保
  • 获取jsp各种参数方法总结

    package coreservlets import java io import javax servlet import javax servlet http import java util Creates a table show
  • C++学习(五十四)qt发布mac程序

    当你用Qt开发好程序后 是不是会很期待将你的成果分享给你的小伙伴 可是Qt的库并不是OS X标配的 所以我们要自己去复制库到app包里 才可以让app在其他未安装Qt的电脑上运行 比较幸运的是 Qt为我们提供了macdeployqt工具 借
  • 端到端深度学习与自动驾驶(含参考文献)

    参考文献见最后 1 自动驾驶系统的分类 Rule based system基于规则的系统 也有论文中将这样的方法叫做Mediated percepiton approach Fully end to end 端到端的系统 也有论文中叫做be
  • IT产业的70:20:10规律

    IT产业的发展是迅速而无法抗拒的 一家技术优秀 管理正规的互联网公司从奠基到上市往往只需要很少的时间 例如英特尔和微软从上市起用了十年的时间确立了它们在微机领域的霸主地位 并达到百亿产值 而思科上市后只用了五年左右的时间就主导了网络硬件的市
  • day39 动态规划

    62 不同路径 机器人每次只可以向右 或者 向下 每次向右走 dp i 0 1 dp 0 j 1 dp i j dp i 1 j dp i j 1 i的范围 0 m 1 j的范围 0 n 1 63 不同路径 II 解法同上 需要考虑障碍物
  • MQTT 官方资源地址

    MQTT官方资源地址 http mqtt org MQTT的官方地址 https www eclipse org paho downloads php MQTT源码的下载地址 官网源码 请参见官方资料和源代码 以免少走弯路 陷入大坑
  • 数据挖掘技术-绘制饼图

    绘制饼图 前置步骤 准备数据guomin npz 下载数据guomin npz到Linux本地的 course DataAnalyze data目录 绘制饼图 pyplot中绘制饼图的函数为pie 使用pie函数绘制2017年第一季度各产业
  • oracle表的storage参数说明

    author skatetime 2009 05 12 修改表的存储参数 storage 解釋 pctfree和pctused 用來控制數據塊中的空閑空間的使用 空閑空間用於數據行的插入和更新 initrans和maxtrans 用來控制分
  • Netty和Tomcat的区别

    一 Netty和Tomcat有什么区别 Netty和Tomcat最大的区别就在于通信协议 Tomcat是基于Http协议的 他的实质是一个基于http协议的web容器 但是Netty不一样 他能通过编程自定义各种协议 因为netty能够通过
  • GIT简单介绍及常用命令

    git是什么 git是目前企业使用最多最流行的 分布式版本 控制系统 分布式版本控制系统 没有中央服务器 每个人的电脑就是一个完整的版本库 工作时候不需要联网 因为版本就在自己的电脑上面 如果多人同时编写修改一个文件的时候 只需要将两者之间
  • matlab快捷键自动对齐

    matlab用了一段时间发现移动代码的时候很容易出现对不齐的情况 一行行缩进很让人头疼 后面发现原来可以自动缩进 方法如下 matlab中全选某段代码 Ctrl i 可以代码自动排版
  • esh的snapshot快照备份

    1 Elasticsearch的snapshot快照备份 优点 通过snapshot拍摄快照 然后定义快照备份策略 能够实现快照自动化存储 可以定义各种策略来满足自己不同的备份 缺点 还原不够灵活 拍摄快照进行备份很快 但是还原的时候没办法
  • 乐蜂网服务器信息,乐蜂网目标独立上市 唯品会向其派驻CEO、CFO

    腾讯科技讯 王可心 2月25日消息 在乐蜂网 今日 唯品会副总裁冯佳路 乐蜂网副总裁辛益华接受媒体采访 解答外界疑问 控股乐蜂网后 为何又参股东方风行集团 在过去10天 唯品会与乐蜂网 东方风行集团分别发生交易 2月14日 唯品会宣布战略投
  • 爬虫的工作原理、挑战和应用

    什么是网络爬虫 网络爬虫 Web Crawler 是一种自动化程序 它能够在互联网上浏览网页 收集信息并将其存储在本地或其他地方供进一步处理和分析 爬虫通常用于搜索引擎 数据挖掘 内容聚合 价格比较等应用中 爬虫的工作原理 发送请求 爬虫从
  • Node.js 全网最详细教程(第三章:Node.js 文件系统模块)

    fs 文件系统模块 fs 模块是Node js 官方提供的 用来操作文件的模块 它提供了一系列的方法和属性 用来满足用户对文件的操作需求 一 fs readFile 异步读取文件 源码解析 参数1 path 读取的路径 参数2 option
  • ProGuard 进阶系列(二)配置解析

    书接上文 从开源库中把代码下载到本地后 就可以在 IDE 中进行运行了 从 main 方法入手 可以看到 ProGuard 执行的第一步就是去解析参数 本文的内容主要分析源码中我们配置的规则解析的实现 在上一篇文章末尾 在 IDE 中 添加
  • WARNING: Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connec

    WARNING Retrying Retry total 0 connect None read None redirect None status None after connection broken by SSLError SSLE
  • C语言函数不定参数实现方式

    函数如何实现不定参数 由于在C语言中没有函数重载 解决不定数目函数参数问题变得比较麻烦 即使采用C 如果参数个数不能确定 也很难采用函数重载 对这种情况 提出了指针参数来解决问题 1 va list 定义了一个指针arg ptr 用于指示可