C语言_可变参数列表解析
来源:互联网 发布:空间和域名 编辑:程序博客网 时间:2024/06/06 03:27
在自定义函数时,例如int fun(int a,int b)的传参都是固定个数的,那么如何自定义一个可传自定义个参数的函数呢?首先我们可以参照printf()函数的定义。
printf(char* format,…);“…”表示参数列表未确定的部分,而列表里最少要有一个确定的参数,即可以是fun(int a,int b,…); 但不可以fun(…);
在函数内部代码上,如何实现对不确定部分参数的访问和使用?如果能解决这个问题,那么就解决了传自定义个参数的函数的定义。
解决这个问题,首先要理解函数的栈帧结构,理解形参在内存中如何存储。栈帧结构可以参见博主上一篇博文C语言_函数栈帧
比如要定义一个求平均值的函数fun();可以传n个数,求这n个数的平均值。我们可以这样int fun(int n,…);f当我我们这样使用fun()函数时,fun(n,a,b,c)栈帧结构如下:
形参是从右往左依次压栈的,所以c在高地址,n在最下面,当我们取到n的地址和n的参数类型时,就能取到a的地址,int *p=&n,a的地址就是p+1;同理可以得到b和c的地址。
int fun(int n,..){ int num=0; int *p=&n; int i=0; for(i=0;i<n;i++) { num+=*(p+i); } return num/n;}
除了这个方法,还可以使用宏va_list,声明一个变量va_list arg,arg就用于访问可变参数列表不确定部分。首先用va_start(arg,n)初始化arg,使arg指向可变参数的第一个参数,int x1=va_arg(arg,int)把第一个参数以int类型赋值给x1,arg就会自动指向下一个参数,访问完毕之后还需要调用宏va_end(),用va_end(arg)结束。
int fun(int n,...) { int num=0; int i=0; va_list arg; va_start(arg,n); for(i=0;i<n;i++) { num+=va_arg(arg,int); } va_end(arg); return num/n;
像这样使用宏的方法,同样可以实现对可变参数列表的访问。
- C语言_可变参数列表解析
- C语言-可变参数列表的解析
- C语言中可变参数列表解析
- 解析c语言中可变参数列表
- c语言:可变参数列表
- 【C语言】可变参数列表。
- C语言,可变参数列表
- C语言可变参数列表
- C语言-可变参数列表
- C语言可变参数列表
- 【C语言】可变参数列表
- c语言可变参数列表
- 全面解析C语言中可变参数列表
- C语言可变参数列表解析及简单应用
- 全面解析c语言的可变参数列表
- C语言可变参数解析
- c语言的可变参数列表
- c语言函数可变参数列表
- Java并发编程札记-(一)基础-05线程安全问题
- 中介者模式
- 安卓VectorDrawable矢量图在原图基础上添加点击时 ripple 水波纹特效
- random随机数
- Eclipse插件springsource-tool-suite的下载和安装
- C语言_可变参数列表解析
- java基础(三)
- LeetCode:Best Time to Buy and Sell Stock with Cooldown
- android 视图 sufaceview
- c编程之乘法表+素数+闰年
- Logstash学习20_[logstash-input-file]插件使用详解
- tps(第三人称射击游戏) 4.角色射击
- JS运算符之&&和||
- static关键字内存分析