c可变参数

本文为个人学习笔记,仅供个人学习、复习使用。
参考链接:链接1、链接2

在c语言中,我们可以定义这样的函数,函数带有可变数量的参数。

int func(int num,...){
.
.
.
}
int main(){func(2,2,3);
}

1、要注意定义函数时函数的形式;
c语言中的printf()函数其实也是一个可变参数函数,它的原型如下:
int printf(const char *format,...);
c语言之所以可以支持可变参数函数,一个重要的原因是c调用规范中规定c语言函数调用时,参数是从右向左压入栈的;这样一个函数实现的时候,就无需关心调用他的函数会传递几个参数过来,而只要关心自己用到几个。如printf()函数:
printf("%d%s\n",i,s);

printf()函数在定义的时候,不知道函数调用的时候回传递几个参数,在实现上,printf()函数只关心第一个参数,即字符串"%d"s\n",当读到%d的时候,printf()知道自己需要第二个参数,这时只需要去栈上寻找即可,当读到%s的时候,再去栈上寻找一个参数即可,也就是说printf()函数不关心栈上到底压了多少参数,只关心自己需要多少。
如何实现可变参数函数呢?

2、要包含头文件<stdarg.h>,并注意释放内存。

1、定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
2、在函数定义中创建一个va_list类型变量,该类型是在stdrag.h头文件中定义

3、使用int参数和va_start宏来初始化va_list变量为一个参数列表,宏va_start是在stdarg.h头文件中定义的。
4、使用va_arg宏和va_list变量来访问参数列表中的每个项。
5、使用宏va_end来清理va_list变量的内存。

eg:

#include<stdio.h>
#include<stdarg.h>double average(int num,...){va_list valist;double sum=0.0;int i;va_start(valist,num);for(i=0;i<num;i++){sum+=va_arg(valist,int);}va_end(valist);return sum/num;
}int main(){printf("Average of 2,3,4,5=%f\n",average(4,2,3,4,5));printf("Average of 5,10,15=%f\n",average(3,5,10,15));return 0;
}
宏va_list、va_arg、va_end定义在stdarg.h中,原型如下:
void va_start(va_list ap,last);
//取第一个可变参数的指针给ap,last是函数声明中的最后一个固定参数
type va_arg(va_list ap,type);
//返回当前ap指向的可变参数的值,然后ap指向下一个可变参数;type表示当前可变参数的类型,支持的类型为int和double
void va_end(va_list ap);
//将ap置为null

这里要注意一点va_arg()函数的第二个参数不能被指定为char、short、或float。
char、short会被提升为int,而float会被提升为double。(这里涉及到整数提升的问题,可百度整数提升四个字了解)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376006.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dz打不开plugin. php,Discuz!应用中心打不开空白的解决方法

近期&#xff0c;很多使用Discuz!程序建论坛的站长都会发现&#xff0c;Discuz!后台的应用中心打不开了。这二天Discuz!终于给出了原因&#xff1a;十分抱歉的通知您&#xff0c;由于资源和人力投入问题&#xff0c;我们已经关闭了 www.discuz.net 的发言权限&#xff0c;但是历…

编程习题05

1、给定一个数组a[N],我们希望构造数组b[N]&#xff0c;其中b[i]a[0]*a[1]*...*a[N-1]/a[i]。在构造过程&#xff1a;不允许使用除法&#xff1b;要求O(1)空间复杂度和O(n)时间复杂度&#xff1b;除遍历计数器与a[N] b[N]外&#xff0c;不可使用新的变量(包括栈临时变量、对空间…

ECshop安装及报错解决方案总结

一、安装ECshop ECShop是一款B2C独立网店系统 &#xff0c;适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。2006年3月推出以来1.0版以来&#xff0c;受到市场的检验&#xff0c;广受好评。 1.安装准备 ECshop最新版本为2.7.3…

Command mysql 中文,MySQL Command Line[mysql命令行常用命令]_MySQL

bitsCN.comMySql下载地址&#xff1a;www.mysql.org第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysqlmysql -u用户名-p用户密码mysql -uroot -p&#xff0c; 回车後提示你输入密码&#xff0c;输入12345&#xff0c;然後回车即可进入到mysql中了&…

setTimeout里如果有$(this),$(this)指的是谁?

$(".next").click(function(){ setTimeout(function(){$(this).addClass("gray");//指向的是window 而不是$(".next") },1000); })转载于:https://www.cnblogs.com/xchlsl/p/4484762.html

数据结构--数组实现线性表

线性表&#xff1a;由同类型数据元素构成的有序序列的线性结构 编译环境&#xff1a;Dev-C 结构实现&#xff1a; struct LNode {ElementType Data[MAXSIZE];int last; }; 主要操作函数&#xff1a; List MakeEmpty();//初始化一个空表ElementType FindKth(int k, List L);//根…

Codeforces Round #241 (Div. 2) A. Guess a number!

题目链接 题意 &#xff1a; 就是猜数游戏&#xff0c;根据给定的操作&#xff0c;让你输出一个符合条件的。 思路 &#xff1a; 这个题好玩儿&#xff0c;设置两个变量&#xff0c;一个找符合条件的数的上限&#xff0c;一个找下限&#xff0c;再判断一下。 1 #include <st…

php中嵌套调用的原理,嵌套调用

## 嵌套调用- 模块与模块之间的相互调用(相对路径)- 项目和项目之间的相互调用(绝对路径)- 也可以写一个通用模块就可以大面积使用&#xff0c;减少代码维护成本- 或许可以实现一些神奇的效果#### 示例代码设置文件/html/www/demo/tpl/tpl.blade.php内容如下~~~这是最顶端模块{…

SET-UID程序漏洞实验

20125102 一、实验描述 Set-UID 是Unix系统中的一个重要的安全机制。当一个Set-UID程序运行的时候&#xff0c;它被假设为具有拥有者的权限。例如&#xff0c;如果程序的拥有者是root&#xff0c;那么任何人运行这个程序时都会获得程序拥有者的权限。Set-UID允许我们做许多很有…

统计文件中有多少个单词amp;c语言实现

假设文件中的单词都是字母的组合&#xff0c;且单词间用空格或者“."区分。实验环境&#xff1a;Dev-C#include<stdio.h> #include<stdlib.h>int main(){FILE *fp;int i;int fr;long fsize;int word0;int sum0;char filename[20];char *buffer;printf("要…

oracle mul,汇编语言乘指令 MUL、IMUL的具体使用

MUL: 无符号乘;影响 OF、CF 标志位;指令格式:;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX当乘积的高半部分(AH、DX、EDX、RDX)中存有结…

java实验二

课程&#xff1a;Java程序设计 班级&#xff1a; 1352 姓名&#xff1a;黄卫   学号&#xff1a;20135221 成绩&#xff1a; 指导教师&#xff1a;娄嘉鹏 实验日期&#xff1a;2015.05.05 实验密级&#xff1a; 预…

两数之和c语言实现

题目描述&#xff1a;给定一个整数数组和一个目标值&#xff0c;找出数组中和为目标值的两个数。你可以假设每个输入只对应一种答案&#xff0c;且同样的元素不能被重复利用。示例:给定 nums [2, 7, 11, 15], target 9因为 nums[0] nums[1] 2 7 9 所以返回 [0, 1]解题思路…

【Linux】正确的关机方法

1&#xff09;shutdown命令 我们较常使用的是shutdown这个命令&#xff0c;这个命令可以安全地关闭或重启Linux系统&#xff0c;它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数&#xff0c;可以是一个精确的时间&#xff0c;也可以…

oracle 存储过程写文件,Oracle写本地文件

Oracle写本地文件是指写到运行Oracle的主机上&#xff0c;而不是运行该脚本的机器上。说起来有点拗口&#xff0c;实际上就是无论在哪里执行这个过程&#xff0c;生成的文件始终都是在服务器上的。下面过程实现了这个功能&#xff1a;logdir是指文件存放路径。有Oracle的direct…

两数相加c语言实现

给定两个非空链表来表示两个非负整数。位数按照逆序方式存储&#xff0c;它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。示例&#xff1a;输入&#xff1a;(2 -> 4 -> 3) (5 -> 6 -&g…

jQuery获取Select选择的Text和Value

一、 jQuery获取Select选择的Text和Value:语法解释&#xff1a; $("#select_id").change(function(){//code...}); //为Select添加事件&#xff0c;当选择其中一项时触发varcheckText$("#select_id").find("option:selected").tex…

jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!)...

昨天才写了一个方法&#xff0c;今天发现一个更简单的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么处理binray文件,Linux下如何反汇编arm raw binary文件

有一个arm elf文件经过objcopy -O binary 命令处理生成bin文件进行反汇编:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty连虚拟机中Linux出现Access Denied

环境&#xff1a;VMwarekali Linux出现这个问题&#xff0c;肯定是你想尝试直接通过使用root账户连接你的linux&#xff0c;这样肯定是不行的&#xff0c;why&#xff1f;为了保证服务器安全&#xff0c;几乎所有的服务器都禁止了超级用户直接登录系统&#xff0c;而是通过普通…