void reset(int &num)
{
num = 90;
}
void creset(const int &num)
{
int num1 = num;
num1 = 30;
}
void preset(int *p)
{
*p = 50;
}
void cpreset(const int *p)
{
int num(70);
p = #
}
void rreset(int(&arr)[10])
{
for (auto i = 0; i < 10; i++)
{
cout << arr[i] << endl;
}
}
void initiaresert(initializer_list<int> list)
{
//initializer_list begin end操作类似vector
for (auto beg = list.begin(); beg != list.end(); ++beg)
{
cout << *beg << endl;
}
}
int shreset(int firstParam...)
{
va_list arg_ptr;
int sum = 0;
int nArgValue;
sum += firstParam;
va_start(arg_ptr, firstParam);
do
{
nArgValue = va_arg(arg_ptr, int);
sum += nArgValue;
} while (nArgValue != 0);
va_end(arg_ptr);
return sum;
/*
va_start(args,paramN) 令对可变函数参数的访问可行。
第一个参数为va_list类型的变量
第二个参数为"..."前最后一个参数
将args初始化为指向可变参数列表第一个参数
va_arg(args,type) 访问下一个可变函数参数。
第一个参数为va_list类型的变量
第二个参数是返回值的类型
调用va_arg获取当前的参数,并自动更新指向下一个可变参数
va_end(args) 结束可变参数函数的遍历。
释放va_arg变量
*/
}
int main()
{
//参数传递
//传递引用:可以避免拷贝,
int rnum(80);
reset(rnum);
cout << rnum << endl;
//单纯的引用会改变参数的值,这时可以使用const引用
creset(rnum);
cout << rnum << endl;
//还可以传递指针或常量指针,传入常量指针时会保留底层忽略顶层
int * pnum(&rnum);
preset(pnum);
cout << rnum << endl;
//传入常量指针,const只是限定pcnum操作,赋值给其他变量时不会带有const
int * const pcnum(&rnum);
preset(pcnum);
cout << rnum << endl;
//传入指向常量的指针
const int * cpnum(&rnum);
//preset(cpnum);//错误 cpnum的类型为const int *,而函数形参的类型为int *
cpreset(cpnum);//传入的也是cpnum的拷贝
cout << *cpnum << endl;
//传入数组,函数参数不能拷贝数组,所以会转化为指针
int arr[10]{0};
preset(arr);
preset(&arr[9]);
//传递数组引用,会限制数组的大小,函数参数为[10]的话,传递的参数也要为[10],可使用模版解决
rreset(arr);
//可变形参函数
//参数类型一致的话可使用initializer_list
//参数类型不一致可以使用模版
initializer_list<int> li{0};
initiaresert({11,22,33,44,55,66,77});//序列传递时需要使用{}抱住
//省略符形参
/*
void foo(parm_list, ...);
parm_list为形参类型 中间逗号可以去掉
还有一种形式
void foo(parm_list, ...);
*/
cout << shreset(1, 2, 3, 4, 5,0) << endl;
return 0;
}