16可变参数列表解析
2017-12-26 16:54
288 查看
可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中。这个头文件申明了一个类型va_list和三个:va_start,va_arg,va_end。
(1)va_list:申明变量,用于访问参数列表的未确定部分;
(2)va_start:初始化va_list申明的变量,它的第一个参数是va_list变量的名字,第二个参数是省略号前最后一个有名字的参数。通过初始化把va_list变量设置为指向可变参数部分的第一个参数;
(3)va_arg:用于访问参数,它的第一个参数是va_list变量的名字,第二个参数是参数列表中下一个参数的类型。在有些函数中,参数类型都是一样的,但有些函数可能要通过前面获得的数据来判断下一个参数的类型,例如,prinf检查格式字符串中的字符来判断它需要打印的参数的类型。va_art返回这个参数的值,并使va_list变量指向下一个可变参数,如果此时已经是最后一个参数,则指向NULL。
(4)va_end:当访问最后一个可变参数之后,用va_end置空va_list变量,即va_list变量=(void *)0。
使用可变参数,实现函数,求函数参数的平均值
使用可变参数,实现函数,求函数参数的最大值
(1)va_list:申明变量,用于访问参数列表的未确定部分;
(2)va_start:初始化va_list申明的变量,它的第一个参数是va_list变量的名字,第二个参数是省略号前最后一个有名字的参数。通过初始化把va_list变量设置为指向可变参数部分的第一个参数;
(3)va_arg:用于访问参数,它的第一个参数是va_list变量的名字,第二个参数是参数列表中下一个参数的类型。在有些函数中,参数类型都是一样的,但有些函数可能要通过前面获得的数据来判断下一个参数的类型,例如,prinf检查格式字符串中的字符来判断它需要打印的参数的类型。va_art返回这个参数的值,并使va_list变量指向下一个可变参数,如果此时已经是最后一个参数,则指向NULL。
(4)va_end:当访问最后一个可变参数之后,用va_end置空va_list变量,即va_list变量=(void *)0。
使用可变参数,实现函数,求函数参数的平均值
使用可变参数,实现函数,求函数参数的最大值
#include<stdio.h> #include<stdarg.h> int Average_value(int num, ...) { va_list arg; va_start(arg, num); int average = va_arg(arg, int); num--; int tmp = 0; while (num--) { tmp = va_arg(arg, int); average = (average&tmp) + ((average^tmp) >> 1); } return average; } int main() { printf("average_value:%d\n", Average_value(2, 3, 5)); printf("average_value:%d\n", Average_value(3, 3, 5, 6)); printf("average_value:%d\n", Average_value(4, 3, 5, 6, 9)); return 0; }
#include<stdio.h> #include<stdarg.h> int maxData(int nums, ...) { va_list arg; va_start(arg, nums); int tmp=va_arg(arg, int); int max = tmp; nums--; while (nums--) { tmp = va_arg(arg, int); if (tmp > max) { max = tmp; } } va_end(arg); return max; } int main() { printf("max:%d\n", maxData(2, 23, 21)); printf("max:%d\n", maxData(3, 23, 21, 2)); printf("max:%d\n", maxData(4, 23, 21, 34, 12)); printf("max:%d\n", maxData(5, 23, 21, 213, 432, 53)); return 0; }
模拟实现printf函数
#include<stdio.h> #include<stdarg.h> #include<assert.h> void printInt(int data) { if (data > 9) { printInt(data / 10); } putchar(data % 10 + '0'); } int my_printf(const char* msg, ...) { assert(msg); va_list arg; va_start(arg, msg); const char* p = msg; while (*p) { if (*p == '%') { p++; switch (*p) { case 'd': printInt(va_arg(arg, int)); break; case 'c': putchar(va_arg(arg, char)); break; case 's': { char* str = va_arg(arg, char*); while (*str) { putchar(*str); str++; } } break; } } else { putchar(*p); } p++; } va_end(arg); } int main() { my_printf("%s,%d,%c,hello bit!\n", "hello world", 1234, 'A'); return 0; }