可变参数的实现
来源:互联网 发布:网上教育软件 编辑:程序博客网 时间:2024/05/21 10:59
可变参数可以让函数接受一个以上的任意多个参数,可变参数又是怎么实现的呢?
看看源码
定义一个指向参数个数的指针va_list.
_INTSIZEOF(n)这个宏用来求取变量所占内存空间的大小。假如n为int类型((4)+4 - 1&~((4) - 1 ))即7&~3
0011取反为1100按位与0111变成0100(4)。
_ADDRESSOF(v)就是(&v)。
完成一系列宏替换后:
va_start(ap,v)就是让指针va_list加上变量类型的大小即让指针指向函数可变参数列表的第一个可选参数。
va_arg(ap,t)后的括号较多,首先ap+=变量类型的大小是让指针跳到下一个参数,ap-变量类型的大小再强转为相应类型的指针并解引用
是为了让指针指向原来的参数并返回所指向的内容。
va_eng是为了将指针置无效。
知道了可变参数列表的实现的原理再来看一段代码
int avg(int n,...)
{
va_list arg;
int total = n;
int sum = 0;
va_start(arg,n);
while(n--)
{
sum += va_arg(arg,int);
}
return sum/total;
va_end(arg);
}
int main()
{
printf("avg = %d",avg(3,10,2030));
return 0;
}
用可变参数列表求取若干个数中的平均值。
首先va_list定义了一个指向个数的可变参数列表指针arg。
va_start(arg,n)是取地址arg强转为(char*)并加上int类型的大小,使指针指向第一个可选参数10。
va_arg(arg,int)取得每个参数,sum+=va_arg(arg,int)求得所有参数的和。
所有数的和除以参数的个数就能得到平均值了。
va_end(arg)将指针arg置为无效。
这就是可变参数的实现啦。
- 可变参数的实现
- 可变参数的实现
- 可变参数的实现
- 可变参数的实现
- 可变参数函数的实现
- 可变参数函数的实现
- 参数可变函数的实现
- 可变参数函数的实现
- 可变长度参数的实现
- 函数可变参数的实现
- 可变参数列表的实现
- 可变参数列表的实现
- printf可变参数的实现
- 可变参数函数的实现
- C可变参数的实现
- 参数可变函数的实现(上)
- 如何实现参数个数可变的函数
- 参数可变函数的实现(上)
- Anaconda安装opencv
- Retrofit+Rxjava+ok+拦截器的封装
- java基础零碎基础知识整理
- 【Machine Learning】KNN学习算法与C语言实现
- RxJava+Retrofit+OkHttp+mvp
- 可变参数的实现
- C语言基础与提高4——指针函数,函数指针
- Swagger与SpringMVC整合
- BZOJ3728: PA2014Final Zarowki
- 图形学opengl实验二-桌子的矩阵变换
- 如何打开内部编码格式不统一的文件?
- 内核设备树简介-2
- 指针函数的简单例程
- .9.png的区域划分