c语言可变参数,C 可变参数详解

所谓可变参数又称参数个数可变函数,即函数参数数目可变,我想你也会经常遇到一个问题就是你想要一个可变数量的参数,不是就指定的函数,那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 可变参数就要先掌握上面这些知识点,那对以后学更深的知识点会是很有帮助的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值