可变参数列表浅析
2017-11-20 20:09
204 查看
1,什么是可变参数?
在C语言编程中,函数中形式参数的个数一般是确定的,调用函数是一次实例化这些参数,有时候函数的参数会具有不确定性,这时候会一些参数个数可变的函数,比如,使用可变参数,求函数参数的最大值。:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<stdarg.h> //可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件
int average(int n, ...)//...为可变参数列表部分
{
va_list arg;//声明一个va_list类型的变量arg
int i = 0;
int max = 0;
va_start(arg, n);//va_start来初始化arg,arg指向可变参数的第一个元素
//实现函数大小判断
for (i = 0; i < n; i++)
{
int val = va_arg(arg, int);//将int类型作为参数,目的是读取int长度值,va_arg是一个宏;
if (max < val)
{
max = val;
}
}
return max;
va_end(arg);//访问完成最后一个可变参数时,需要调用va_end来清理参数列表;
}
int main()
{
int a = 13;
int b = 22;
int c = 12;
int num1 = average(3, a, b, c);//使用可变参数时,应该先输入可变参数的个数,再传入参数。
printf("%d ", num1);
system("pause");
return 0;
}
从上面的例子可以看出,实现可变参的步骤如下:
1)声明一个va_list型的变量arg,arg是用来指向第一个参数的指针,用来访问参数列表的未确定部分
2)然后用va_start宏初始化变量arg,这个宏的第二个参数是‘...’前的最后一个有名字的参数.
3)用va_arg来访问可变的参数,并且赋值于val. va_arg的第二个参数是要读取的参数的类型,这里是int型.同时va-arg指向下一个可变参数
4)使用结束,用va_end宏结束可变参数.
关于stdarg宏
可变参数列表是通过宏来实现的,这些宏定义在stdarg.h 文件中。该文件声明了一个类型va-list和三个宏va-start,va-arg,va-end,三个宏的作用只是用来确定可变参数列表中每个参数的内存地址,编译器是不知道参数的实际数目的。参数中的“..."用于提示此处可能传递数量和类型未确定的参数。
可变参数的注意事项
①可变参数必须从头到尾按顺序逐个访问,可以中途停止
②如果一开始就想访问中间元素是不行的
在C语言编程中,函数中形式参数的个数一般是确定的,调用函数是一次实例化这些参数,有时候函数的参数会具有不确定性,这时候会一些参数个数可变的函数,比如,使用可变参数,求函数参数的最大值。:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<stdarg.h> //可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件
int average(int n, ...)//...为可变参数列表部分
{
va_list arg;//声明一个va_list类型的变量arg
int i = 0;
int max = 0;
va_start(arg, n);//va_start来初始化arg,arg指向可变参数的第一个元素
//实现函数大小判断
for (i = 0; i < n; i++)
{
int val = va_arg(arg, int);//将int类型作为参数,目的是读取int长度值,va_arg是一个宏;
if (max < val)
{
max = val;
}
}
return max;
va_end(arg);//访问完成最后一个可变参数时,需要调用va_end来清理参数列表;
}
int main()
{
int a = 13;
int b = 22;
int c = 12;
int num1 = average(3, a, b, c);//使用可变参数时,应该先输入可变参数的个数,再传入参数。
printf("%d ", num1);
system("pause");
return 0;
}
从上面的例子可以看出,实现可变参的步骤如下:
1)声明一个va_list型的变量arg,arg是用来指向第一个参数的指针,用来访问参数列表的未确定部分
2)然后用va_start宏初始化变量arg,这个宏的第二个参数是‘...’前的最后一个有名字的参数.
3)用va_arg来访问可变的参数,并且赋值于val. va_arg的第二个参数是要读取的参数的类型,这里是int型.同时va-arg指向下一个可变参数
4)使用结束,用va_end宏结束可变参数.
关于stdarg宏
可变参数列表是通过宏来实现的,这些宏定义在stdarg.h 文件中。该文件声明了一个类型va-list和三个宏va-start,va-arg,va-end,三个宏的作用只是用来确定可变参数列表中每个参数的内存地址,编译器是不知道参数的实际数目的。参数中的“..."用于提示此处可能传递数量和类型未确定的参数。
可变参数的注意事项
①可变参数必须从头到尾按顺序逐个访问,可以中途停止
②如果一开始就想访问中间元素是不行的
相关文章推荐
- 浅析可变参数列表的使用
- 浅析可变参数列表
- 浅析可变参数列表
- 可变长度参数列表
- c语言,可变参数列表实现任意个数求平均值
- C语言~对可变参数列表的简单理解
- 【C/C++】sprintf中如何将容器作为可变参数列表传入
- Python 函数可变参数列表*args和**kwargs
- 可变参数列表求一组数的最大值
- Thinking in Java 第5章 初始化与清理 【可变参数列表】
- 参数个数可变函数浅析
- 可变参数列表,stdarg
- C语言,可变参数列表
- Java可变参数列表说明(int... array)
- 可变参数列表
- 可变参数列表_stdarg宏
- 可变参数列表
- 可变参数列表实现机制与printf()函数源码分析
- java5特性(可变参数列表)
- C语言中的可变参数函数的浅析(以Arm 程序中的printf()函数实现为例) .