C语言学习之路第十七站 可变参数

2023年 9月 5日 18.6k 0

在函数中定义一个接受可变数量的参数,定义方式为:int func_name(int arg1,...);

在使用时代码抽象如下:

int func(int, ... )  {
   .
   .
   .
}

int main() {
   func(2, 2, 3);
   func(3, 2, 3, 4);
}
  • 需要使用 stdatg.h 头文件,该文件提供了实现可变参数功能的函数和宏
  • 最后一个参数写成省略号,三个点。 int 表示要传递的可变参数总和。
  • 使用步骤:
    • 定义一个函数,最后参数为省略号,省略号可以设置自定义参数
    • 在函数中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的
    • 使用 int 参数和 va_start() 宏来初始化 va_list 变量为一个参数列表。 宏 va_start() 是在 stdarg.h 头文件中定义的
    • 使用 va_arg() 宏 和 va_list 变量来访问参数列表中的每个项
    • 使用宏 va_end() 来清理赋予 va_list 变量的内存
  • 常见的宏使用
    • va_start(ap , last_arg) 初始化可变参数列表。 ap 是 va_list 类型的变量,va_arg 是最后一个固定参数的名称,也可以是可变参数之前的参数。该宏将 ap 指向可变参数列表中的第一个参数
    • va_arg(ap , type) 获取可变参数列表中下一个参数。ap 是va_list 类型的变量,type是下一个参数的变量。该宏返回类型为 type 的值,将 ap 指向下一个参数
    • va_end(ap) 结束可变参数列表的访问。 ap 是va_list 类型的变量,该宏将 ap 设置为 NULL

写一个带有可变参数的函数,返回他们的平均值:

#include

// 可变参数测试方法
double average(int num, ...)
{
        va_list valist;
        double sum = 0.0;
        int i;

// 为 num 个参数初始化
va_start(valist, num);

//访问所有赋给 valist 的参数
for (i = 0; i < num; i++)
{
	sum += va_arg(valist, int);
}

//清理为 valist 保留的内存
va_end(valist);

return sum / num;
}

printf("Average of 2,3,4,5 = %f n", average(4, 2, 3, 4, 5));
printf("Average of 10,23,34,2,3,5 = %fn", average(6,10,23,34,2,3,5));

image.png

其实看上面内容还很空洞,并没有理解。下面再参考一些网友的留言。

#include 

void debug_arg(unsigned int num, ...)
{
unsigned int i = 0;
unsigned int *addr = &num;
for (i = 0; i

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论