所谓可变参数又称参数个数可变函数,即函数参数数目可变,我想你也会经常遇到一个问题就是你想要一个可变数量的参数,不是就指定的函数,那c语言中的可变参数就能发挥作用了。就像我前面说的,c可变参数就是能改变参数个数的。

原型声明格式为:

type VarArgFunc(type FixedArg1, type FixedArg2, …);
我们来一个例子来练习:
int func(int, ... )
{ . . . }
int main()
{
func(2, 2, 3);
func(3, 2, 3, 4);
}

像上面的这个例子,函数 func() 最后一个参数写成省略号,即三个点号(...),省略号之前的那个参数是 int,代表了要传递的可变参数的总数。为了使用这个功能,您需要使用 stdarg.h 头文件,该文件提供了实现可变参数功能的函数和宏。具体的步骤如下:

· (1)首先要先定义一个函数,最后一个参数用省略号来表示,省略号前面设置自定义的参数。

· (2)在函数定义的时候需要创建一个va_list 类型变量,这个类型是需要在stdarg.h 头文件中定义的。

· (3)接下来就是用int参数和 va_start 宏来初始化 va_list 变量为一个参数列表,在这里要注意va_start宏也是在tdarg.h 头文件中定义的。

· (4)然后就用va_list 来访问列表中的每一项。

· (5)最后使用宏va_end 来清理赋予 va_list 变量的内存。

· 可以用下面的代码来实现:

我想上面这样讲,还是会不明白,我们就来用一个例子来说明:

我们传入n个int数据,目的是计算平均值

* 求任意个数量的平均数
* @param num
* @param ... 入参必须为int类型
123456789101112131415161718192021 * @return
double averge(int num, ...) {
va_list valist;
double sum;
va_start(valist, num);
for (int i = 0; i < num; i++) {
sum = sum + va_arg(valist, int);//参数2说明返回的类型为int
}
va_end(valist);
return sum / num;
}
//调用函数
printf("averge: %d\n", averge(3, 5, 15, 10));
//结果:averge: 10

可以通过实例看出,首先我们定义了一个va_ list类型的变量,紧接着用va_ start方法来把valist初始化,然后利用va_ arg来取出传入的可变参的每一个值,最后要注意,要调用va_end释放valist之前占用的空间。这样的话,对这个过程就已经掌握的差不多了。

对于C 可变参数还有一个知识点就是C 可变参数传递,包括:传递int可变参数个数;传递char类型可变参数个数;传递logn类型可变参数个数;上面已经举了一个传递int可变参数个数,接下来就说一个传递char类型可变参数个数。

* 不定个参数为char类型
* @param num
* @param ... 入参必须为char类型参数
void charTest(int num, ...) {
va_list valist;
char ch[num];
char *pot = ch;
va_start(valist, num);
for (int i = 0; i < num; i++) {
strcat(ch, va_arg(valist, char*));
}
printf("ch : %s\n", ch);
}12345678910111213141516
如何来取得char类型的数据呢?这里我们要返回的数据是char*指针类型的。然后使用strcat方法将字符串拼接取来。
charTest(3, "a", "b", "c");
//结果:ch : abc

上面这些案例都是比较经典的,学习这些知识离不了多多练习,学C 可变参数就要先掌握上面这些知识点,那对以后学更深的知识点会是很有帮助的。