C语言中的可变参数列表
首先写一段简单的代码用来理解可变参数列表
#include<stdio.h>
#include<stdarg.h>//实现可变参数列表时,必须使用此头文件
int Add(int n, ...)
{
va_list arg;
int sum=0;
int i=0;
va_start(arg, n);
for(i=0;i<n;i++)
{
sum+=va_arg(arg, int);
}
va_end(arg);
return sum;
}
int main()
{
int sum=0;
sum=Add(5, 1,2,3,4,5);
printf("%d\n",sum);
return 0;
}
这是一个简单的加法函数,我们用可变参数列表的方式来实现它,它就可以来求任意个数的和。
●可变参数函数的定义方法
函数类型 函数名( int 参数个数, … )
●对可变参数函数的深度理解(以上面的简单代码为例)
●va_list:
在vs2013环境下,将va_list转到定义得
即为将char* 类型重命名,所以在上面的代码中,
va_list arg;//char* arg;创建一个字符指针
●va_start(arg, n):
将va_start(arg, n)转到定义得:
INTSIZEOF(n);//当n的大小为1或2或3字节时,INSIZEOF(n)=4
//当n的大小为5或6或7个字节时,INSIZEOF(n)=8
//...
即上面的代码中va_start(arg, n)就可以替换为:
arg=(char *)&n + 4;//把n的地址取出并强制类型转换为char*类型
//再给n的地址加4并让arg指向将这个地址
//即让arg指向参数部分的第一个参数
●va_arg(arg, int):
将va_arg(arg, int)转到定义得:
将va_arg(arg, int)进行替换:
sum+=(*(int *)((arg+=4)-4));//先将arg加4的值赋给arg
//使得arg指向的位置向后挪动4个字节
//再将arg-4 使得表达式结果所产生的地址指向原先的位置
//将所得到的结果强制类型转换为int*类型并进行解引用
这段代码的作用:取出当前位置参数并为下一次获取参数做好准备。
●va_end(arg):
将va_end(arg)转到定义得:
代码就可以替换为:
arg=(char*)0;//让指针不再指向原来的位置