mysql不定参数函数_可变参数函数(一)
一个函数可以接受不定数的参数个数,这就是可变参数函数,比较常见的比如printf(),scanf();
printf(const char*format,…);
printf(“%d”,i);
printf(“%s”,s);
printf(“the numberis %d,stirng is :%s”,i,s);
变量参数函数的简单实现:
#include#include
int simple(intnum,...)
{int i,result = 0;
va_list vl;
va_start(vl,num);
printf("num:%d, vl:%d\n",num,*vl);for(i = 0; i < num - 1 ; i++)
{
result= va_arg(vl,int);
printf("in for result:%d ,*vl:%d\n",result,*vl);
}
va_end(vl);returnresult;
}intmain()
{int sum = simple(5,1,2,3,4,5);if(0 ==sum)
{
printf("simple failed\n");
}else{
printf("simple success! sum = %d\n",sum);
}return 0;
}
结果如下:
exbot@ubuntu:~/wangqinghe/DeBug/20190702$ ./VA
num:5, vl:1020625376
in for result:1 ,*vl:1020625376
in for result:2 ,*vl:1020625376
in for result:3 ,*vl:1020625376
in for result:4 ,*vl:1020625376
simple success! sum = 4
sum.c
#include#include#include
double add(intn,...)
{//printf("add...\n");
int i = 0;double sum = 0;
va_list argptr;
va_start(argptr,n);//初始化argptr
for(i = 0 ; i < n; i++) 对每个可选参数,读取类型为int的参数
{
sum+= va_arg(argptr,int); //累加到sum中
}
va_end(argptr);
printf("add_sum = %f\n",sum);returnsum;
}int main(int argc,char **argv)
{double sum = 0;int *p = malloc(argc * sizeof(int));inti;for(i = 1; i < argc; i++)
{
p[i]=atoi(argv[i]);
printf("p[%d] = %d\n",i,p[i]);
}
sum= add(argc,p[1]);
printf("sum = %f\n",sum);
sum= add(argc,p[1],p[2]);
printf("sum = %f\n",sum);
sum= add(argc,p[1],p[2],p[3]);
printf("sum = %f\n",sum);free(p);return 0;
}
输出结果;
exbot@ubuntu:~/wangqinghe/DeBug/20190702$ ./sum 10 20 30
p[1] = 10
p[2] = 20
p[3] = 30
add_sum = 239745405.000000
sum = 239745405.000000
add_sum = 56.000000
sum = 56.000000
add_sum = 69.000000
sum = 69.000000
相关函数介绍:
可变函数列表的实现由几个宏组成的,在文件#include中。
va_list 定义某个变量,内核的定义如下:
typedef char *va_list; //字符指针类型
va_start(ap,type) 开始获取可变参数列表中第一个参数(…里面的第一个),也就是跳过第一个参数。(所以以上的第一个输出是个随机值)。
#ifndef __sparc__#define va_start(AP, LASTARG) \(AP= ((char *) &(LASTARG) + __va_rounded_size (LASTARG)))//ap指向下一个参数,lastarg不变
#else
#define va_start(AP, LASTARG) \(__builtin_saveregs (), \
AP= ((char *) &(LASTARG) + __va_rounded_size (LASTARG))) //跳过下第一个参数,指向第二个参数内存地址
#endif
//对type向上取整 取int的整 4,然后乘上int整型4的倍数
#define __va_rounded_size(TYPE) \(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
Va_arg(args,int)循环获取可变参数列表中的参数,args指向下一个参数地址,返回的是当前参数地址。
//first=va_arg(args,int)
#define va_arg(AP, TYPE) \//ap指向下一个类型的参数(AP+= __va_rounded_size (TYPE), \//返回ap - sizeof(type)参数,即前一个参数
*((TYPE *) (AP -__va_rounded_size (TYPE))))//对type向上取整 取int的整 4,然后乘上int整型4的倍数
#define __va_rounded_size(TYPE) \(((sizeof (TYPE) + sizeof (int) - 1) / sizeof (int)) * sizeof (int))
最后一个va_end(ap)结束标志,在程序中只是作为一个可变参数列表的结束标识,在stdarg.h中仅仅定义了一下,没有实现代码部分。
mysql不定参数函数_可变参数函数(一)相关推荐
- python中可变参数args传入函数时储存的类型是_[转载]Python中函数的参数定义和可变参数*args与**args...
Python中函数的参数定义和可变参数 *args与**args区别 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和** ...
- #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号
[Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...
- Python 函数的可变参数(*paramter与**paramter)的使用
Python 函数的可变参数主要有 *paramter与**paramter 可变参数主要有 *paramter的作用 接受任意多个实际参数并放到一个元组中 def people(*people):f ...
- Python基础教程:函数的可变参数
在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c--,请计算a2 + b2 + c2 + --. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...
- Python 函数的可变参数、切片、迭代和列表生成式
1. 函数的可变参数 def fun(*args):print(args) 让一个函数能接受任意个参数,可以定义一个可变参数.可变参数的名字前面有个 * 号,我们可以传入0个.1个或多个参数给可变参数 ...
- C和指针之函数之可变参数
1.可变参数如何实现 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,这个头文件声明了一个类型va_list和三个宏,va_start.va_arg.va_end,一般我们声明一个 ...
- python可变参数函数二阶导数公式_python中函数的可变参数
简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...
- python函数可变参数_python中函数的可变参数
知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 本节视频教程 文字教程开始: 一.[其实已经用过]可变参数 回顾系统自带的可变参数函数print #系统自带的可变参数函数 ...
- Python 函数(可变参数)
在python函数中,可以定义可变参数,顾名思义,可变参数就是,传入的参数是可变的 例如,给定一组数字a,b,c... 请计算a2 + b2 + c2 + -- 要定义出这个函数,我们必须确定输入的 ...
最新文章
- 图解插入排序--直接插入排序
- 自动化测试里的数据驱动和关键字驱动思路的理解
- Listener 监听器
- 认识Node.js中流
- php代码金字塔几种,php输出金字塔的2种实现方法
- Python中的join()函数和split()函数的用法
- frida 安装特定版本
- 20幅扎心漫画,道尽无数人的人生!30万网友:这简直是在偷窥我生活...
- 工作171:阅读账号里面的新增调用接口操作
- 信息学奥赛一本通C++语言——1097:求阶乘的和
- 计算机视觉基础:图像处理 Task 04:图像滤波
- iOS App打包上架超详细流程1
- CAD图纸一键共享,永久轻松办公!
- 飞Young任意路由器连接[破解路由器限制]
- 计算机初级cad,CAD 初级入门
- iOS13.0上适配深色模式
- python def是什么意思-python里面def是什么意思
- CMMI3和CMMI5的区别
- 机器人网络系统时延笔记(LAN+WLAN)
- 寒假算法训练1-J(分棍子,求最长棍子的数量,另外学习map的排序方法)