C语言_函数可变参数列表
2017-11-07 13:09
323 查看
函数可变参数列表的应用和原理
在网上看到各位前辈关于这部分的介绍有些是过于简洁,有些则是过于晦涩,有的代码拿出来甚至在编译器上跑不过去,所以在这里讲一下自己对于可变参数的认识,若有不正确的地方,欢迎各位网友指出来,以便不断修正这块的内容。
————————————————————————————————————我们平常在使用函数传参时,往往会传进去固定的参数,我在这里举一个设计函数求几个数最大值的栗子:
#include<stdio.h> #include<windows.h> int my_max(int x,int y,int z) { int max=0; if(x>y) max=x; else max=y; if(max>z) return max; else return max=z; } int main() { int a=12; int b=21; int c=121; printf("a=%d,b=%d,c=%d\n",a,b,c); printf("max=%d",my_max(a,b,c)); system("pause"); return 0; }
从这个例子中我们可以看到他的局限性就在于,传进去的参数的个数是固定的,也就是这个my_max函数只能用于求三个数的最大数,以后若是想要求更多数的最大数,就不得不重新设计函数。所以,我们可以应用函数可变参数来避免这一局限性,下面我用可变参数的方式再写一遍这个函数:
#include<stdarg.h> //交换两个变量的值 void swap(int *x,int *y) { *X^=*y; *y^=*x; *x^=*y; } int my_max(int values,...)//注意此处的逗号后面是三个英文句号! { int i=0; int max=0; va_list varg;//注意此处的varg是一个随意起的变量名 va_start(varg,values); for(;i<values;i++) { int num=0; num=va_arg(varg,int); if(max<num) swap(&max,&num); } va_end(varg); return max; }
这个函数在调用的时候是这样传参的:
my_max(n_values,x,y,z……);
下面我来解释一下函数可变参数的用法及原理
——————————————————————————
用va_list定义了一个指针(即varg), 而在c语言中,函数调用时,参数是从右向左依次压入栈中的(每个函数在调用的时候都会形成一个帧栈结构),所以这个指针依次可以指向所有的函数,直至结束。知道了这个,就不难理解为什么可以依次遍历函数的参数了。
再来看va_start(),这个是获取函数可变参数里的第一个参数,从此处我们也可以想到,被调用函数的参数列表里,至少要有一个命名参数。如果 连一个命名参数也没有,那么就无法使用va_start()了 。
最后一定要记得va_end(),来关闭这个指针。
在应用可变参数的时候还要注意这两个问题
——————————————————————————1. 在调用函数时,要自己加上参数的数量,因为这些宏无法判断实际存在的参数的数量,如果你没加,那么编译器就会报错。
2. 一定要注意传进去参数的类型是否符合你所想要的,因为这些宏无法自己判断每个参数的类型,结果是不可预知的。
相关文章推荐
- 主题六 函数(C语言核心)----34.可变参数列表
- c语言中的函数可变参数列表相关的三个宏
- c语言中的函数可变参数列表相关的三个宏
- C语言定义可变参数列表的函数
- C语言(函数传递可变长度的参数列表)va_arg
- 【C语言】printf函数的简单实现(可变参数列表)
- c语言中参数列表可变的函数写法,如printf
- GCC下,C语言参数的内存分配 以及 函数可变参数
- C语言中可变参数函数实现原理浅析
- C语言中va(可变函数参数) 的另一种用法与危险事项
- c语言中可变参数函数的设计
- 深度剖析C语言可变参数列表
- C语言中的可变参数函数 三个点“…”printf( const char* format, ...)
- c语言中可变参数函数的设计
- C语言中可变参数的函数使用技巧
- C语言如何编写可变参数函数
- 用C语言实现参数个数可变的函数
- php实现函数可变参数列表
- C语言可变长参数函数与默认参数提升(转)
- Python中函数参数(默认、列表、可变长度、字典类型)