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;//让指针不再指向原来的位置
相关文章推荐
- 可变参数列表源码的理解与剖析
- c语言中对可变参数列表的简单理解
- C语言中可变参数列表的剖析
- C语言~对可变参数列表的简单理解
- 可变参数列表源码的剖析
- 可变参数源码的剖析和自己的理解
- c语言中对可变参数列表的简单理解
- 可变参数列表源码的剖析
- 深度理解C语言可变参数列表
- 可变参数列表源码的剖析
- 深度剖析C语言可变参数列表
- 可变参数列表源码的剖析
- C语言中可变参数列表解析
- 解析c语言中可变参数列表
- C语言(函数传递可变长度的参数列表)va_arg
- C语言·可变参数列表
- Linux 源码系列之可变参数列表实现
- 全面解析C语言中可变参数列表
- [C语言]利用stdarg.h来实现可变参数列表
- C语言-可变参数列表的解析