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
函数并传递不同数量的参数,然后打印出计算出来的平均数。