一个函数可以接受不定数的参数个数,这就是可变参数函数,比较常见的比如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不定参数函数_可变参数函数(一)相关推荐

  1. python中可变参数args传入函数时储存的类型是_[转载]Python中函数的参数定义和可变参数*args与**args...

    Python中函数的参数定义和可变参数 *args与**args区别 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和** ...

  2. #{}不自动改参数类型_【Just For Fun】C - 可变参数函数、可变参数宏 __VA_ARGS__、额外的逗号

    [Just For Fun] 本系列纯粹娱乐.研究用.一些旁门左道的东西. 事实上可能完全没用. (๑•̀ω•́๑) 對於可变参数函数.可变参数宏 __VA_ARGS__ , 我曾經有在另一些地方寫過 ...

  3. Python 函数的可变参数(*paramter与**paramter)的使用

    Python 函数的可变参数主要有 *paramter与**paramter 可变参数主要有 *paramter的作用 接受任意多个实际参数并放到一个元组中 def people(*people):f ...

  4. Python基础教程:函数的可变参数

    在Python函数中,还可以定义可变参数. 如:给定一组数字a,b,c--,请计算a2 + b2 + c2 + --. 要定义出这个函数,我们必须确定输入的参数.由于参数个数不确定,我们首先想到可以把 ...

  5. Python 函数的可变参数、切片、迭代和列表生成式

    1. 函数的可变参数 def fun(*args):print(args) 让一个函数能接受任意个参数,可以定义一个可变参数.可变参数的名字前面有个 * 号,我们可以传入0个.1个或多个参数给可变参数 ...

  6. C和指针之函数之可变参数

    1.可变参数如何实现 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中,这个头文件声明了一个类型va_list和三个宏,va_start.va_arg.va_end,一般我们声明一个 ...

  7. python可变参数函数二阶导数公式_python中函数的可变参数

    简介 INTRODUCTION一.[其实已经用过]可变参数 二.可变参数+普通参数 结合用法1 三.知识要点总结强调 知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 一. ...

  8. python函数可变参数_python中函数的可变参数

    知识回顾: 1.函数关键字参数 2.函数的参数的默认值.必须从右边写到左边. 本节视频教程 文字教程开始: 一.[其实已经用过]可变参数 回顾系统自带的可变参数函数print #系统自带的可变参数函数 ...

  9. Python 函数(可变参数)

    在python函数中,可以定义可变参数,顾名思义,可变参数就是,传入的参数是可变的 例如,给定一组数字a,b,c...  请计算a2 + b2 + c2 + -- 要定义出这个函数,我们必须确定输入的 ...

最新文章

  1. 图解插入排序--直接插入排序
  2. 自动化测试里的数据驱动和关键字驱动思路的理解
  3. Listener 监听器
  4. 认识Node.js中流
  5. php代码金字塔几种,php输出金字塔的2种实现方法
  6. Python中的join()函数和split()函数的用法
  7. frida 安装特定版本
  8. 20幅扎心漫画,道尽无数人的人生!30万网友:这简直是在偷窥我生活...
  9. 工作171:阅读账号里面的新增调用接口操作
  10. 信息学奥赛一本通C++语言——1097:求阶乘的和
  11. 计算机视觉基础:图像处理 Task 04:图像滤波
  12. iOS App打包上架超详细流程1
  13. CAD图纸一键共享,永久轻松办公!
  14. 飞Young任意路由器连接[破解路由器限制]
  15. 计算机初级cad,CAD 初级入门
  16. iOS13.0上适配深色模式
  17. python def是什么意思-python里面def是什么意思
  18. CMMI3和CMMI5的区别
  19. 机器人网络系统时延笔记(LAN+WLAN)
  20. 寒假算法训练1-J(分棍子,求最长棍子的数量,另外学习map的排序方法)

热门文章

  1. 不同浏览器CSS隐藏元素滚动条
  2. 【IT】C语言函数中怎么返回一个二维数组
  3. 因一个 Bug,Cassandra 4.0 暂停发布
  4. 湘苗培优|从入门到精通
  5. 中国工业信息安全大会召开,开发新技术与新模式,推动工业互联网安全发展
  6. Windows VS Linux,Linux或将成为最终赢家?
  7. 英雄会被表彰,这些技术与代码也将载入史册!
  8. 机器学习火热,SQL 开发人员有何用?
  9. 11 国股市熔断,“祸及”程序员?!
  10. 为什么 12306 时不时要崩那么一下?