函数可变参数列简单用法
2017-05-03 08:30
411 查看
可变参数即表示参数个数可以变化,可多可少,也表示参数的类型也可以变化,可以是int,double还可以是char*,类,结构体等等。
#include <stdio.h>
#include <stdarg.h>
int average(int n,...)
{
int ret = 0;
int sum = 0;
int i = 0;
va_list arg; //初始化arg为char类型指针
va_start(arg,n); //将arg指向n的右边第一位参数
for(i=0; i<n; i++)
{
sum += va_arg(arg,int); //取当前参数的值并将arg指向下一个参数
}
va_end(arg); //将arg清空为NULL
ret = sum/n;
return ret;
}
int main()
{
int aver = average(4,3,2,1,2);
printf("%d\n",aver);
return 0;
}
一一简介一下
va_list:按下F12看下va_list定义
由此可见va_list相当于 char* ,使用它就相当于定义一个char 指针。
va_start(arg,n) :看定义
va_start 是一个宏,编译时被_crt_va_start替换,再看看[b]_crt_va_start[/b]
[b]
[/b]
[b]其中的_ADDRESSOF作用就相当于取地址操作&,_INTSIZEOF相当于提升到一个int的大小,如果n是1~4那么结果就是4;5~8就是8;9~12就是12,以此类推;
[/b]
由此可见va_start的左右就是将n右边的第一个参数地址给arg(形参在栈中是先压最右边的参数,由于栈空间是从高地址向低地址写入,所以最上面的也就是n)
va_arg(arg,int):看定义()
简化一下就等价于(*(int*)(arg += 4)-4);
arg先+4,此时arg指向下一个参数地址,再-4则返回的是当前参数的内容。非常漂亮的代码。
va_end(arg):定义
arg = (char*)0;
arg = NULL;
va_end(arg)的作用就是将arg指针置为NULL.
#include <stdio.h>
#include <stdarg.h>
int average(int n,...)
{
int ret = 0;
int sum = 0;
int i = 0;
va_list arg; //初始化arg为char类型指针
va_start(arg,n); //将arg指向n的右边第一位参数
for(i=0; i<n; i++)
{
sum += va_arg(arg,int); //取当前参数的值并将arg指向下一个参数
}
va_end(arg); //将arg清空为NULL
ret = sum/n;
return ret;
}
int main()
{
int aver = average(4,3,2,1,2);
printf("%d\n",aver);
return 0;
}
一一简介一下
va_list:按下F12看下va_list定义
由此可见va_list相当于 char* ,使用它就相当于定义一个char 指针。
va_start(arg,n) :看定义
va_start 是一个宏,编译时被_crt_va_start替换,再看看[b]_crt_va_start[/b]
[b]
[/b]
[b]其中的_ADDRESSOF作用就相当于取地址操作&,_INTSIZEOF相当于提升到一个int的大小,如果n是1~4那么结果就是4;5~8就是8;9~12就是12,以此类推;
[/b]
由此可见va_start的左右就是将n右边的第一个参数地址给arg(形参在栈中是先压最右边的参数,由于栈空间是从高地址向低地址写入,所以最上面的也就是n)
va_arg(arg,int):看定义()
简化一下就等价于(*(int*)(arg += 4)-4);
arg先+4,此时arg指向下一个参数地址,再-4则返回的是当前参数的内容。非常漂亮的代码。
va_end(arg):定义
arg = (char*)0;
arg = NULL;
va_end(arg)的作用就是将arg指针置为NULL.
相关文章推荐
- C 语言中可变参数的用法(两个简单的小实例)
- C++...三个点用法 实现参数个数可变的函数
- C可变参数用法以及自己的Message()函数
- python 函数传递可变参数的用法
- c语言基于stdarg.h的可变参数函数的用法
- PHP5.6新增加的可变函数参数用法分析
- python3中函数参数的四种简单用法
- Python中函数的参数定义和可变参数用法实例分析
- c笔记——可变长参数函数用法
- 可变参数列表:简单printf函数的实现
- 简单记录下C语言中的可变参数列表两种用法
- 【C语言】printf函数的简单实现(可变参数列表)
- 20180302JS的深入学习:函数的深入用法、函数的参数、JS内置对象、动态时钟及验证表单的练习、JS原型链的简单了解
- Python可变参数函数用法实例
- C++可变参数函数( 如:void Func(int a, int b, ...) )用法
- 可变参数的函数的原理及其简单模仿
- php定义参数数量可变的函数用法实例
- Python可变参数函数用法实例
- C 语言可变参数函数原理及用法
- C语言中va(可变函数参数) 的另一种用法与危险事项