前言
一直以来对变长参数都比较好奇,索性花时间解解痒.
先从数组指针来看
void test1(int* arr,int count)
{
int sum = 0;
for (int *p = arr; p < arr + count; p++)
{
sum = sum+ *p;
}
printf("%d\n",sum );
}
代码较为简单,此处不再展开.
接下来是可变参数
可变参数需要使用
<stdarg.h>
头文件,请提前导入
- 什么是可变参数?
- 可变参数是函数或方法中形如
int show(int a,...)
这样的的参数
- 可变参数是函数或方法中形如
- 可变参数的相关规定
...
不能单独出现,且只能放在参数列表中的最后- 变长参数的类型没有限定,使用时最好统一类型,避免类型安全问题
- 变长参数的个数没有限定,调用时一般以
0x00
即NULL/nil
结尾
void test2(int a,...)
{
int sum = a;
//声明变长参数列表vl
va_list vl;
//va_start :将变长参数的前一个参数的地址存入vl
va_start(vl,a);
int next;
//va_arg :将vl向后偏移sizeof(int),并返回偏移后长度为sizeof(int)的数据
//判断 next 是否为 0x00 ,如果不为 0x00 则继续遍历
while( (next = va_arg(vl,int)) )
{
sum+= next;
}
//释放变长参数列表vl
va_end(vl);
printf("%d\n",sum );
}
调用形式
int main(int argc,char * args[])
{
int arr[] = {1,2,3,4,5};
//数组指针
test1(arr,5);
printf("---------\n");
//变长参数
test2(1,2,3,4,5,6,NULL);
return 0;
}
输出结果
15
---------
21
小结
...
的类型不做限定,因此在函数或方法调用时可传递任何类型,包括但不限于ObjC
中使用的id
等类型
另外暂未查看到<stdarg.h>
的源码,只能推测其中也是使用的数组指针进行的处理.如有纰漏请批评指正.