c++函数参数传递

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值