C 可变参数学习笔记

C语言提供了可变参数函数的功能,允许在调用函数时传递不定数量的参数。这种技术在处理多个参数的函数中非常有用,例如打印格式化输出的函数。以下是C语言中使用可变参数的示例:

示例1:打印格式化输出

cCopy Code
#include <stdio.h> #include <stdarg.h> void printMsg(int count, ...) { va_list ap; int i; va_start(ap, count); for(i = 0; i < count; i++) { printf("%s ", va_arg(ap, char*)); } va_end(ap); } int main() { printMsg(3, "Hello", "world", "!\n"); return 0; }

在这个示例中,我们定义了一个名为printMsg的函数,该函数采用可变参数的形式来打印消息。函数首先使用va_list类型的变量ap来声明一个指向参数列表的指针,在va_start宏中将其初始化,然后使用va_arg宏来逐个读取每个参数并打印。最后,我们使用va_end宏来释放参数列表。

main函数中,我们调用了printMsg函数并传递了三个参数,分别是要打印的三个字符串。

示例2:计算平均数

cCopy Code
#include <stdio.h> #include <stdarg.h> double average(int num, ...) { va_list valist; double sum = 0.0; int i; /* 为 num 个参数初始化 valist */ va_start(valist, num); /* 访问所有赋给 valist 的参数 */ for (i = 0; i < num; i++) { sum += va_arg(valist, int); } /* 清理为 valist 保留的内存 */ va_end(valist); return sum / num; } int main() { printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2, 3, 4, 5)); printf("Average of 5, 10, 15 = %f\n", average(3, 5, 10, 15)); return 0; }

在这个示例中,我们定义了一个名为average的函数,该函数采用可变参数的形式来计算平均数。首先要先按照参数列表的个数初始化va_list类型的变量valist,它是一个指向参数列表的指针。之后,我们使用va_arg宏来遍历参数列表并将每个整数类型的参数加入到sum总和中。最后,我们使用va_end宏来释放参数列表。

main函数中,我们分别调用average函数并传递不同数量的参数,然后打印出计算出来的平均数。