您的位置:首页 > 编程语言 > C语言/C++

C语言中的可变参数列表源码的剖析与理解

2018-03-14 11:58 435 查看

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;//让指针不再指向原来的位置
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: