wordpress 英文企业站,seo工资,网站建设公司优惠中,网站开发实训周报文章目录 1 前言2 实例2.1实例程序2.2程序执行结果2.3 程序分析 3 补充4 总结 1 前言
在编程过程中#xff0c;有时会遇到需要定义参数数量不固定的函数的情况。
C语言提供了一种灵活的解决方案#xff1a;变参函数。这种函数能够根据实际调用时的需求#xff0c;接受任意… 文章目录 1 前言2 实例2.1实例程序2.2程序执行结果2.3 程序分析 3 补充4 总结 1 前言
在编程过程中有时会遇到需要定义参数数量不固定的函数的情况。
C语言提供了一种灵活的解决方案变参函数。这种函数能够根据实际调用时的需求接受任意数量的参数。
本文将通过具体的实例程序介绍如何定义和使用变参数函数并分析其原理。 2 实例
2.1实例程序
下面这段代码实现了一个名为 average 的可变参数函数用于计算平均值。该函数接受一个固定参数 num指示将要计算平均的数值个数随后跟随着省略号 …表示其后跟随的是不定数量的数值参数。
#include stdio.h
#include stdarg.hdouble average(int num,...)
{va_list valist;double sum 0.0;va_start(valist, num); //为 num 个参数初始化 valist /* 访问所有赋给 valist 的参数 */for (int i 0; i num; i){sum va_arg(valist, int);}va_end(valist); //清理为 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));
}2.2程序执行结果 2.3 程序分析
1.函数参数传递的原理 为更好的理解变参数函数首先介绍下函数函数参数传递的原理。传入参数是以栈的形式存取举个例子声明一个函数如下
void fun(int x, float y, char z);在调用函数 fun 时参数按照相反的顺序入栈首先是 int x接着是 float y最后是 char z即在内存中的存储顺序是 z-y-x。
知道这些参数在内存中是连续存储的从理论上讲如果我们能够探测到这些参数中的任意一个变量的内存地址并且了解其类型以及相关类型的内存布局我们可以使用指针算术来计算并访问其他参数的地址。
2.变参函数 average() 的执行遵循以下符合参数传递原理的步骤
创建一个va_list 类型 变量valist用于存储变参函数的参数列表使用 宏 va_start用于初始化 va_list类型的变量确保它指向变参函数的第一个命名参数 num该参数地址紧邻可变参数区域...利用 宏 va_arg 来访问参数列表valist中的每个int类型项每次调用后 valist 将自动更新以指向下一个参数使用宏 va_end 来清理赋予valist变量的内存 通过上面对变参函数的分析可知变参函数并不是所有的参数都可以省略即函数不能定义成fun(...) 这种形式至少需要一个固定参数如实例程序中的num来作为变参列表的开始标记 3 补充
下面再介绍一个实例拓展一下变参函数的使用它通过变参函数列表和vsnprintf函数格式化字符串输出整数、浮点数等类型的变量。
1.程序
#include stdio.h
#include stdarg.hint i1;
double j 45.67;
char message[50];void fun(const char *format, ...)
{va_list args;va_start(args, format);vsnprintf(message, sizeof(message), format, args);va_end(args);// 打印格式化后的字符串printf(%s\n, message);
}int main(void)
{fun(var1: %d, i);fun(var1: %d var2: %f , i, j);return 0;
}2.程序执行结果 3.函数vsnprintf介绍
vsnprintf函数是一个C语言标准库函数用于将格式化的数据写入到一个字符串缓冲区中并且可以指定最大写入的字符数。
函数原型
int vsnprintf(char *str, size_t size, const char *format, va_list arg);参数说明
str指向用于存储格式化后的输出的字符数组的指针。size缓冲区的大小以字符为单位包括空字符‘\0’的空间。如果size为0vsnprintf将不写入任何字符但会返回需要的缓冲区大小不包括空字符。format格式化字符串指定了如何格式化后续参数。argva_list类型的参数列表包含了要格式化的参数。
返回值
vsnprintf返回写入到str缓冲区中的字符数不包括终止的空字符’\0’如果发生错误或者缓冲区大小不足以容纳所有字符则返回负值。
实例程序中main函数中调用fun(var1: %d var2: %f , i, j);时其内部vsnprintf函数的调用相当于直接使用vsnprintf(message, sizeof(message), var1: %d var2: %f , i, j);进行格式化输出。 4 总结
本文将通过具体的实例程序介绍了如何定义和使用变参数函数并分析其原理。 参考链接 va_start 用法 C 可变参数 【C语言】vsnprintf函数的使用