函数如何实现不定参数:
由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。
(1)va_list 定义了一个指针arg_ptr, 用于指示可选的参数.
(2)va_start(arg_ptr, argN)使参数列表指针arg_ptr指向函数参数列表中的第一个可选参数,argN是位于第一个可选参数之前的固定参数, 或者说最后一个固定参数.如有一va函数的声明是void va_test(char a, char b, char c, …), 则它的固定参数依次是a,b,c, 最后一个固定参数argN为c, 因此就是va_start(arg_ptr, c).
(3)va_arg(arg_ptr, type)返回参数列表中指针arg_ptr所指的参数, 返回类型为type. 并使指针arg_ptr指向参数列表中下一个参数.返回的是可选参数, 不包括固定参数.
(4)va_end(arg_ptr)清空参数列表, 并置参数指针arg_ptr无效.(注:va在这里是variable-argument(可变参数)的意思. 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件)
以下以几个栗子来说明情况:
例1:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdarg.h> 4 5 int print(const char *format, ...) 6 { 7 va_list args; 8 const char *args1; 9 va_start(args, format);10 args1 = va_arg(args,const char *);11 va_end(args);12 printf("format=%s args1=%s", format, args1);13 }14 int main()15 {16 print("11111", "22222");17 }
运行结果:
1 /*2 format=11111 args1=222223 Process returned 24 (0x18) execution time : 0.542 s4 Press any key to continue.5 */
例2:
1 例2: 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <stdarg.h> 5 6 int print(const char *format, ...) 7 { 8 va_list args; 9 const char *args1;10 va_start(args, format);11 args1 = va_arg(args,const char *);12 va_end(args);13 printf("format=%s args1=%s", format, args1);14 }15 16 int main()17 {18 print("11111", "22222", "333333");19 }
运行结果:
1 /*2 format=11111 args1=222223 Process returned 24 (0x18) execution time : 0.542 s4 Press any key to continue.5 */
我们从上面可以看见这样在函数中加入三个参数是没有问题的;
例3:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdarg.h> 4 5 int print(const char *format, ...) 6 { 7 va_list args; 8 const char *args1; 9 va_start(args, format);10 args1 = va_arg(args, const char *);11 args2 = va_arg(args, const char *);12 va_end(args);13 printf("format=%s args1=%s", format, args1, args2);14 }15 16 17 int main()18 {19 20 print("11111", "23333");21 }
运行结果:
1 /*2 format=11111 args1=233333 Process returned 24 (0x18) execution time : 0.153 s4 Press any key to continue.5 6 */
注意是上面并没有三个参数,但是程序还是可以运行起来的!
从上面三个例子可以看出我们传入的参数都是一个类型的参数;
例4:
不同类型的函数参数:
1 int print(const char *format, ...) 2 { 3 va_list args; 4 int args1; 5 va_start(args, format); 6 args1 = va_arg(args, int); 7 va_end(args); 8 printf("format=%s args1=%d", format, args1); 9 }10 11 12 int main()13 {14 15 print("11111", 123);16 }
运行结果:
1 /*2 format=11111 args1=1233 Process returned 22 (0x16) execution time : 0.007 s4 Press any key to continue.5 */
但是注意不能使用:总之,va_arg(ap,type)中的type绝对不能为以下类型:——char、signed char、unsigned char——short、unsigned short——signed short、short int、signed short int、unsigned short int——float
你的内心会被洗成一片空白,自由而宁静,