C++ Primer 6.2参数传递 知识点+练习题

在这里插入图片描述

C++ Primer 6.2参数传递 知识点+练习题

  • 指针形参
  • 使用引用拷贝
  • Const 形参实参
  • 尽量使用常量引用
  • 数组形参
  • 数组引用形参
  • 传递多维数组
  • 向main函数传参数
  • 含有可变形参的函数
  • 练习题
  • 待更新

指针形参

void reset(int *p)
{*p=0;//p指向的整型对象变为0p=0;//只是对形参改变p,使其为空指针
}int i=42;
reset(&i);//i变为0,但地址仍为i的地址

使用引用拷贝

bool isShorter(const string &s1,const string &s2)
{return s1.size()<s2.size();
}

以上需要传入string可能很大,不适合用值传递,拷贝耗空间
不需要修改,最好用const

Const 形参实参

底层const:指向的对象是一个常量,不允许用指针修改
顶层const:只允许指向一个对象
P57 有时间详细整理

const int ci=42;//顶层const ci是常量不可变
int i=ci;//正确,把const赋值给i !!!相当于i=42;
int * const p=&i;//顶层const p只允许指向i的地址
*p=0;//正确,可通过p改变
const int *const pt=&i;//既不可修改,也不可指向其他
const int *cp=&i;
int *p=cp;//错!!!p有修改i的风险

尽量使用常量引用

string::size_type find_char(string &s,char c,string ::size_type occurs)
{}
此函数若传入("hello world",'o',ctr)会发生错误
类型不匹配
若传入的是const string 类型的变量时也会报错

不用const限制传入实参范围

数组形参

传入数组首元素地址
void print(const int*);
void print(const int[]);
void print(const int[10]);
三者等价,无法传递个数,第三个10还是多少都无影响管理大小三种方式
1.使用标记指定(c风格字符数组)
void print(const char *cp)
{while(cp){cout<<*cp++;}
}
只对char数组带'\0'有效,其余无法有合理标记
2.使用标准库规范
void print(const int* beg,const int *end)
{while(beg!=end){cout<*beg++<<endl;}
}
int j[2]={0,1};
print(begin(j),end(j));
用标准库begin,end提供指针 end是指向最后一个元素下一位
3.传入数组大小
void print(const int ia[],size_t size)
{for(size_t i=0;i!=size;i++)cout<<ia[i]<<endl;
}
int j[]={0,1};
print(j,end(j)-begin(j));//!!!计算长度方法

数组引用形参

f(int (&arr)[10]);形参是数组引用
f(int &arr[10]);形参是大小为10的数组,每一个元素是int类型的引用
个数必须对应,传入数组必须也是10个元素才可以

传递多维数组

记住,多维数组就是数组的数组
若为2维数组,传入数组首元素地址(这个数组首元素也是数组,第一行),再传入个数(多少行)

void printf(int (*matrix)[10],int rowsize);//要加括号,不加括号则变成指针的数组了
void printf(int matrix[][10],int rowsize)

向main函数传参数

int main(int argc,char *argv[]){}//指针数组,每个元素都是char类型的指针
int main(int argc,char **argv){}//等价,数组转为指针
在命令行里g++ mymain.cpp a b 
则argv[0]是程序名
argv[1]是a argv[2]是b

含有可变形参的函数

无法提前预知应该向函数传递几个实参
解决办法:1.initializer_list 标准库类型
2.可变参数模板P618
initializer_list:函数实参数量未知但全部实参类型相同,需添加同名头文件

操作解释
initializer_list lst;默认初始化类型为T的空列表
initializer_list lst{a,b,c…}初始化lst列表,元素为const
lst2(lst),lst2=lst拷贝,赋值 不会拷贝元素,是共享元素
lst.size()列表中的元素数量
lst.begin()返回首元素指针
lst.end()返回尾元素下一位置指针

initializer_list 对象中的元素永远是常量值,无法改变

void erroe_msg(initializer_list<string> il)
{for(auto beg-il.begin();beg!=il.end();++beg)//!!!注意此时beg不是迭代器类型,是指针cout<<*beg<<" ";cout<<endl;
}

练习题

6.22 三个swap,分别什么都不变,变值,交换指针
#include<iostream>using std::cout;
using std::endl;void swap0(int *pt1,int *pt2);
void swap1(int *pt1,int *pt2);
void swap2(int *&r1,int *&r2);int main()
{int a=100;int b=200;int *pa=&a;int *pb=&b;cout<<"swap0"<<endl;cout<<"before"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;swap0(pa,pb);cout<<"after"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;
cout<<endl;cout<<"swap1"<<endl;cout<<"before"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;swap1(pa,pb);cout<<"after"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;cout<<endl;cout<<"swap2"<<endl;cout<<"before"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;swap2(pa,pb);cout<<"after"<<endl;cout<<"pa="<<pa<<" pb="<<pb<<endl;cout<<"*pa="<<*pa<<" *pb="<<*pb<<endl;return 0;
}void swap0(int *pt1,int *pt2)
{int *tmp=pt1;pt1=pt2;pt2=tmp;
}void swap1(int *pt1,int *pt2)
{int tmp=*pt1;*pt1=*pt2;*pt2=tmp;
}void swap2(int *&r1,int *&r2)
{int *tmp=r1;r1=r2;r2=tmp;
}

待更新

1.const顶层底层
2.副本拷贝值内存
3.引用和指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/341624.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解如何撰写一个基础的技术交底书

大家好,我是英子老师。作为一名知识产权专家,深耕于专利行业十余年,具有丰富的专利工作经验:曾在大型专利代理机构从事专利代理工作、专利质检工作(抽查代理机构的专利代理人的撰写质量并评分);之后在知名上市企业、行业龙头企业担任高级专利工程师的职位,主要工作内容…

Linux ----冯诺依曼体系结构与操作系统

目录 前言 一、冯诺依曼体系结构 二、为什么选择冯诺依曼体系结构&#xff1f; 三、使用冯诺依曼结构解释问题 问题1&#xff1a; 问题2: 四、操作系统 1.操作系统是什么 2.为什么需要操作系统 3.操作系统怎样管理的 4.如何给用户提供良好环境 五、我们是怎样调用系…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷④

任务二 单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码…

第19课 在Android环境中使用FFmpeg和openCV进行开发的一般步骤

在上节课&#xff0c;根据模板文件我们对在Android环境中使用FFmpeg和openCV进行开发有了一个初步的体验&#xff0c;这节课&#xff0c;我们来具体看一下其工作流程。 1.程序的入口 与VS2013程序开发类似&#xff0c;Android程序开发也有一个入口&#xff0c;在这个模板中&a…

图像识别与计算机视觉有什么区别?

图像识别和计算机视觉在很多方面存在差异&#xff0c;这些差异主要体现在以下几个方面&#xff1a; 1. 研究范围 图像识别是计算机视觉领域的一个子集。计算机视觉不仅包括图像识别&#xff0c;还涵盖了更广泛的内容&#xff0c;如场景理解、目标跟踪、分割、识别和解释等。简而…

SQL-分组查询

目录 DQL-分组查询 分组查询注意事项&#xff1a; DQL- 排序查询 &#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &…

Mysql——索引相关的数据结构

索引 引入 我们知道&#xff0c;数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快&#xff0c;因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是顺序查找&#xff08;linear search&#xff09;&#xff0c;这种复杂度为…

探索 TCP 与 UDP:网络通信的两门学派(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

基于SSM的教室信息管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【常用的简单功能及算法】拦截器 加盐算法 深克隆 时间日期格式化 加盐算法 sql分页算法 验证码

1.实现拦截器 Interceptor (以登录拦截器为例) 1.1 写一个登录拦截器普通类 实现HandlerInterceptor接口重写preHandle方法 //检验登录状态拦截器 //实现接口HandlerInterceptor 重写方法preHandle public class LoginInterceptor implements HandlerInterceptor {/** 该方…

搭建 MyBatis 环境

目录 1.添加依赖 2.数据库连接配置 3.配置XML路径 4.下载插件MyBatisX 5.如何使用 6.示例 1.添加依赖 创建新项目时添加两个依赖: MyBatis Framewrok 和 MySQL Driver 。 如果是在已经创建好的项目中配置mybatis环境。需要先下载一个插件&#xff1a;EditStarters 。 然…

AI换脸-faceswap

&#x1f3e1; 个人主页&#xff1a;IT贫道-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;私聊博主加WX好友&#xff0c;获取更多资料哦~ &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. AI换脸原理 1.1 G…