习题答案请参考:C++ Primer 第五版 第6章 6.2——函数参数传递习题答案


目录

6.2 函数参数传递

6.2.1 传值参数(值传递)

指针形参

6.2.2 传引用参数(引用传递)

使用引用形参返回多个结果

6.2.3 const形参和实参

6.2.4 数组形参

6.25 main:处理命令行选项


6.2 函数参数传递

参数传递有两种:

(1)引用传递: 形参将绑定到对应的实参上,实参值会改变

(2)值传递:将实参的值拷贝后赋给形参,形参和实参是相互独立,不会影响实参的值


6.2.1 传值参数(值传递)

指针形参

通过指针形参,可以改变指针所指的对象的值,但并不会改变指针的地址

如:

void reset(int *ip)
{*ip = 0;   //ip所指的对象值改变ip = 0;    //只改变了ip的局部拷贝,实参为被改变
} 

调用reset函数之后,实参所指的对象值被置为0,但实参本身并没有改变(这里的实参是一个指针,相当于是一个地址):

int i=42;
reset(&i);
cout << "i= " << i << endl;

6.2.2 传引用参数(引用传递)

引用形参相当于是实参的另一个名字,所以会改变实参的值

如:

void reset(int &i)  //引用形参
{i = 0;
} 

调用reset函数时,我们直接传入对象而非对象地址(这里是细节,一定要注意和指针区别,指针需要传入地址!!)

int j = 42;
reset (j);    //引用传递,值会被改变
cout << "j= " << j << endl;   // 输出j=0;

小贴士!!!

在实际中,尽量避免拷贝而使用引用形参,当遇到不会改变对象的内容时,将形参定义成常量引用,即:const string &s1。(细节,面试时候可能就会有此考点!!


使用引用形参返回多个结果

函数返回多个值时,引用形参就提供了有效途径

如:定义名find_char的函数,返回string对象中某个指定字符出现的位置和出现的总次数

思路:给函数传入一个额外的引用实参,令其保存字符出现的次数

//返回s中c出现的位置索引
//引用形参occurs负责统计c出现的总次数
//const string &s则为常量引用
string::size_type find_char(const string &s, char c, string::size_type &occurs)
{auto ret = s.size();  //第一次出现的位置(如果有的话)occurs = 0;   //出现的总次数for (decltype(ret) i = 0; i != s.size(); ++i){   if (s[i] == c){if (ret == s.size())ret = i;   //记录c第一次出现的位置++occurs;  // 将位置加1}}return ret;    //出现次数通过occurs隐式地返回
}

调用上述函数如下:

auto index = find_char(s,'o',ctr);
//返回s中c出现的位置索引
//引用形参occurs负责统计c出现的总次数,额为的引用形参
//const string &s则为常量引用
string::size_type find_char(const string &s, char c, string::size_type &occurs)
{auto ret = s.size();  //第一次出现的位置(如果有的话)occurs = 0;   //出现的总次数for (decltype(ret) i = 0; i != s.size(); ++i){   if (s[i] == c){if (ret == s.size())ret = i;   //记录c第一次出现的位置++occurs;  // 将位置加1}}return ret;    //出现次数通过occurs隐式地返回
}int main()
{size_t cnt = 0;string str("my name is lianglinlin");auto index = find_char(str, 'l', cnt);cout << index << ' ' << cnt << endl;return 0;
}

6.2.3 const形参和实参

小贴士!!!

当形参为const时,其实是被忽略掉cosnt的,即在传递常量对象或者非常量对象都是可以的(细节,注意!!)

这样就要注意如下错误的定义:

void fcn(const int i){  能够读取i,但是不能向i写值   }

void fcn(int i)  {   }   这种定义就错误了,因为上边const被忽略了,所以这里就重复定定义了

小贴士!!!

尽量使用常量引用:把函数不会改变的形参定义成乘凉引用(细节,注意!!)


6.2.4 数组形参

数组要记住两点:

(1)不允许拷贝数组

(2)数组在使用时会被转换为指针

故数组作为形参时,要注意:

(1)不能值传递

(2)传递数组,实际传递的是数组的首元素的指针

管理指针形参的三种技术:

(1) 数组本身包含一个结束标记,如跟着一个空字符串

void print(const char *cp)
{if (cp)  // 若cp不是一个空指针while (*cp)  // 指针指的不是空字符cout << *cp++;  //输出当前字符并将指针向前移动一个位置
}

(2) 使用标准库规范,传递指向数组首元素和尾元素的指针

void print(const int *beg, const int *end)
{//输出beg和end之间(不含end)的所有元素while (beg!=end)  cout << *beg++<<endl;  //输出当前字符并将指针向前移动一个位置
}

(3)显示传递一个表示数组大小的形参,大小可以用end-begin求得

void print(const int ia[], size_t size)
{for (size_t i = 0; i != size;++i)cout << ia[i]<<endl;
}

6.2.5 main:处理命令行选项

argc:表示数组中字符串的数量

argv:是一个数组

C++ Primer 第五版 第6章 6.2——函数参数传递阅读笔记相关推荐

  1. C++ Primer 第五版 第6章 6.7——函数指针阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.7--函数指针习题答案 目录 6.7 函数指针 使用函数指针 返回指向函数的指针 6.7 函数指针 声明一个函数指针,只需要用指针替代函数名即 ...

  2. C++ Primer 第五版 第6章 6.2——函数参数传递习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.2--函数参数传递阅读笔记 目录 6.10 指针形参交换两个数 6.12 引用形参交换两个数 6.13 6.14 6.15 6.16 6.17 ...

  3. C++ Primer 第五版 第6章 6.7——函数指针习题答案

    理论请参考:C++ Primer 第五版 第6章 6.7--函数指针阅读笔记 目录 6.7 函数指针习题答案 6.54 6.55 6.56 6.7 函数指针习题答案 6.54 vector是指向该函数 ...

  4. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句习题答案 目录 6.3 返回类型和return语句 6.3.1 无返回值函数 无返回值函数的特性 6.3. ...

  5. C++ Primer 第五版 第6章 6.3——函数返回类型和return语句习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.3--函数返回类型和return语句阅读笔记 目录 6.31 6.32 6.33 6.34 6.35 6.36 6.38 6.31 返回引用无 ...

  6. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用习题答案

    理论讲解请参考:C++ Primer 第五版 第6章 6.1 函数及函数定义及调用阅读笔记 目录 目录 6.1 形参和实参的区别 6.2 函数语法考察 6.4 交互式输入数字,计算阶乘 6.5 输出实 ...

  7. C++ Primer 第五版 第6章 6.1——函数及函数定义及调用阅读笔记

    习题答案请参考:C++ Primer 第五版 第6章 6.1 函数及函数定义及调用习题答案 目录 6.1 函数基础 函数定义 函数调用 函数的形参和实参 函数的返回类型 局部静态对象 函数声明 头文件 ...

  8. C++ Primer 第五版 第6章——函数阅读笔记及习题答案(完整,附C++代码)

    C++Primer(第五版)第6章函数的阅读笔记及课后习题答案总结,课后习题答案是自己学习写出来的,如果有误,欢迎指正 还不完整,后续会更新添加 阅读笔记 C++ Primer 第五版 第6章 6.1 ...

  9. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)习题答案

    理论讲解请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数) 目录 7.1 定义抽象数据类型习题答案 7.4&7.5 7.6&7.7 7. ...

最新文章

  1. JavaScript异步编程解决方案探究
  2. Linux打过cat没有编码,linux系统 终端下 cat中文乱码/vim不乱码 或者 cat不乱码/vim中文乱码...
  3. elasticsearch入门一
  4. VMware 下扩展linux硬盘空间
  5. java filestream 包,java.io.FileOutputStream.write(byte[] b)
  6. j - 数据结构实验:哈希表_一看就懂的数据结构基础「哈希表」
  7. Buuctf(pwn) picoctf_2018_rop chain 栈溢出
  8. oracle 创建日志文件,oracle创建日志文件
  9. linux下的RPC
  10. 前两年在MSDN里找到的HTC示例,一直没用过,先在这里存个备份
  11. static详解java_java中static作用详解
  12. ECCV2020 Spotlight | 图像定位上的细粒化区域相似性自监督
  13. 深入继承之抽象类和接口综合分析及完整案列解说(一)
  14. Django访问静态资源
  15. 常用正交表(可直接复制)以及混合正交表的使用
  16. 带你彻底弄明白!java简历模板下载
  17. 一台变两台,电脑也分身
  18. Controller中使用swagger注解的正确姿势
  19. 如何查找oracle漏洞对应补丁号,Oracle 漏洞补丁如何查找下载并打补丁,什么漏洞都可用Opatch?...
  20. 802d简明调试手册_802d简明调试手册.pdf

热门文章

  1. eva每一集片尾曲是谁唱的_evaTV版的片尾曲是不是每集的都不一样啊?
  2. python plot map_python的colormap总结(matplotlib+ncl+气象家园调色盘)
  3. 计算机考研压分的学校,篡改分数,恶意压分...考研院校的骚操作大盘点!小心避坑!...
  4. 谷歌浏览器登录不了账号_谷歌浏览器使用分享(可谷歌账号登录)之谷歌账号登录...
  5. 双稳态继电器工作原理图_三招带你分清继电器与接触器
  6. mfc 监控文件操作_商务办公好伴侣 兄弟MFC系列多功能一体机
  7. 巧用计算机辅助培智生,计算机辅助设计答案
  8. mysql 存储过程 排序_mysql存储过程排序
  9. 金蝶系统怎么清理服务器,【金蝶KIS专业版】如何注销加密服务器记录
  10. [bzoj4006][JLOI2015]管道连接_斯坦纳树_状压dp