前序
对于c来说这是可行的
#include <stdio.h>
int f()
{
}
int main()
{
f(1,2,3); //注意这里的f(),没有形参,我却传了3个,但如果f(int, int) //而你传4个形参就是不行,这个问题c++中不会,它的类型检查严格哪个都不行。
}
可变参数列表
头文件#include<stdarg.h>
//定义可变参数 的函数
double average(int n,...)
{
char *p = NULL;
p = (char *)(&n) + 4;
double sum = 0;
//n显示后面有几个参数
for(int i = 0;i < n;i++){
sum += *(int *)(p+i*sizeof(int));
}
p = NULL;
return sum/n;
}
//定义可变参数 的函数
double average(int n,...)
{
va_list var_arg; //类似于上面的p
va_start(var_arg,n); //p=init,n用于确定偏移的初始地址
double sum = 0;
for(int i = 0;i < n;i++){
//p's 取值,var_arg指针变量,double每次偏移大小
sum += va_arg(var_arg,double);
}
va_end(var_arg); //注意指针置空
return sum/n;
}
int main()
{
double a = 10.0,b = 2.2;
//add(a,b,2.90,9,0,9,8,7);
//函数调用时, 第一个参数 必须int类型(表示可变参数个数),
// 可变参数列表 所有数据类型必须一致, 和具体函数实现类型必须一致
double ret = average(3,a,b,6);
cout << "average(2,a,b): " << ret << endl;
return 0;
}
注意几个地方: va_list va_start() va_arg() va_end()
带缺省参数的函数
注意缺省的参数必须放在形参列表的最右端
#include <iostream>
using namespace std;
int f(int , int = 5);
int main()
{
int res;
res = f(4);
cout << res << endl;
cout << f(5,5) << endl;
}
int f(int a, int b)
{
return a + b;
}