C语言中的不定参数

来源:互联网 发布:趣味编程Scratch ppt 编辑:程序博客网 时间:2024/05/18 03:05

原文地址:http://kmplayer.iteye.com/blog/842715


1,最近刚刚知道C语言还有不定参数这么个东东。 

2,解决方法: 
三个宏的使用va_arg()、va_start()和va_end() 
上述的宏原型如下所示: 

C代码  收藏代码
  1.     
  2. type va_arg(va_list argptr, type);  
  3. void va_end(va_list argptr);  
  4. void va_start(va_list argptr, last_parm);  

它们都包含在头文件<stdarg.h>中。 

在VC++6.0中,这几个宏的定义: 
C代码  收藏代码
  1.     
  2. #define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1)) //类型n的大小  
  3. #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //ap指向第一个不定参数地址  
  4. #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址  返回当前ap指向的值,并且增加ap  
  5. #define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效  
  
总结:读取可变参数的过程其实就是堆栈中,使用指针,遍历堆栈段中的参数列表,从低地址到高地址一个一个地把参数内容读出来的过程. 

3,不定参数函数有个限制,就是不定参数的列表必须在整个函数的参数列表的最后。 
我们不可以定义如下的函数: 
  void func(int a, ……, int c) 
  所有类型固定的参数都必须出现在参数列表的开始。 
  在设计具有不定参数列表的函数的时候,我们有两种方法来确定到底多少参数会被传递进来。 
  方法1是在类型固定的参数中指明后面有多少个参数以及他们的类型。printf就是采用的这种方法,它的format参数指明后面每个参数的类型。 
  方法2是指定一个结束参数。这种情况一般是不定参数拥有同样的类型,我们可以指定一个特定的值来表示参数列表结束。 

4,实例代码: 
C代码  收藏代码
  1. #include <stdio.h>  
  2. #include <stdarg.h>  
  3. #include <string.h>  
  4.   
  5. int sumi(int c, ...)  
  6. {  
  7.     va_list argptr;  
  8.     va_start(argptr, c); //初始化变元指针  
  9.     int sum = c;  
  10.     c = va_arg(argptr, int); //作为下一个参数类型的参数类型,返回不定参数  
  11.     //c保存第一个不定参数  
  12.     printf("%d\n", c);  
  13.     while(0 != c) //末尾特定字符指示结束  
  14.     {  
  15.         sum = sum + c;  
  16.         c = va_arg(argptr, int);  
  17.     }  
  18.     va_end(argptr);  
  19.     return sum;  
  20. }  
  21.   
  22. double sum_series(int num, ...)  
  23. {  
  24.     double sum = 0.0, t;  
  25.     va_list argptr;  
  26.     va_start(argptr, num);//初始化变元指针  
  27.     while (num--)  
  28.     {  
  29.         t = va_arg(argptr, double);  
  30.         sum = sum + t;  
  31.     }  
  32.     va_end(argptr);  
  33.     return sum;  
  34. }  
  35.   
  36. int main()  
  37. {  
  38.     int i = sumi(1,2,3,4,5,6,7,8,9,0);  
  39.     printf("%d\n", i);  
  40.     double d = sum_series(4, 1/3.0, 1/4.0, 1/5.0, 1/6.0);  
  41.     printf("%f\n", d);  
  42.   
  43.     return 0;  
  44. }  

0 0
原创粉丝点击