C语言可变参数列表

经常在阅读大神的代码或者很多内核代码时会见到类似这样格式的代码:

void function(const char *, ...)   // 哪儿来的省略号??我记得这文件不是伪代码啊
{
    /* 以下是代码部分 */
}

我也曾一度怀疑我是不是查到了伪代码,或者是书籍本身的省略

后来我又一次成功演绎了真香定律

原来这是C语言里面可变参数列表的一种语法,而且其实是挺常见的一个东西,比如printf()和scanf()函数就用到了这个

(但凡有注意到过printf()函数可以输入不同数量的参数的时候就可以想到一定有这么一个东西支持多参数)

 

可变参数函数:

其实我们自己也能定义这样的函数,而且使用上也并不难,比如下面的示例代码:

#include <stdio.h>
#include <stdarg.h>  // 需要加入这个头文件

int function(int n, ...);

int main()
{
	// 调用两次函数试试,让参数数量不同 
	int s1, s2;
	s1 = function(4, 1, 2, 3 ,4);   // 四个参数 
	s2 = function(3, 5, 5, 5);      // 三个参数 
	
	printf("\n\ns%d=%d\n", 1, s1);  // printf()函数其实也是这种可变参数函数 
	printf("s2=%d\n", s2);
	return 0;
}

int function(int n, ...)   // 三个点是由三个连续的小数点字符组成 
{
	int sum = 0;
	int i = 0;
	
	va_list vp;       // 用于表示参数列表 ,vp是个指针 
	va_start(vp, n);  // vp指向第一个参数 
	
	int a[30];
	for (i = 0;i < n;i++)
	{
		a[i] = va_arg(vp, int);  // 获取到参数值 
		printf("var[%d]=%d\n", i, a[i]);
		sum += a[i];
	}
	va_end(vp);  // 清空vp指针 
	
	return sum;
}

运行一下看看:

主要用到的东西就是:

#include <stdarg.h>  // 要加这个头文件

va_list vp;        // 一个类型
va_start(vp, n);   // 三个宏 
va_arg(vp, int);
va_end(vp);

type function(...){}  // 当然还有最关键的,三个点

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值