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.mzph.cn/news/615472.shtml

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

相关文章

【Git】查看凭据管理器的账号信息,并删除账号,解决首次认证登录失败后无法重新登录的问题

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是是《代码管理工具》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的…

性能测试分析案例-定位内核线程CPU利用率太高

环境准备 预先安装 docker、perf、hping3、curl 等工具&#xff0c;如 apt install docker.io linux-tools-common hping3 操作和分析 Linux 在启动过程中&#xff0c;有三个特殊的进程&#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程&#xff0c;这也是系…

Windows 项目从0到1的部署

目录 一. 安装jdk 1.1 安装jdk 1.2 配置jdk的环境配置jdk 1.3 配置成功 二. 配置tomcat 2.1 启动tomcat 2.2 防火墙设置 三. 安装MySQL 3.1 安装步骤 3.2 内部连接 3.3 外部连接 四. 部署项目 4.1 项目部署 4.2 修改mysql的用户密码 一. 安装jdk 这里给大家准备好了jdk和…

2024.1.8 Day04_SparkCore_homeWork

目录 1. 简述Spark持久化中缓存和checkpoint检查点的区别 2 . 如何使用缓存和检查点? 3 . 代码题 浏览器Nginx案例 先进行数据清洗,做后续需求用 1、需求一&#xff1a;点击最多的前10个网站域名 2、需求二&#xff1a;用户最喜欢点击的页面排序TOP10 3、需求三&#x…

一卡通水控电控开发踩过的坑

最近在做一个项目&#xff0c;是对接一卡通设备的。我一开始只拿到设备和3个文档开局。不知道从哪下手。一步一步踩坑过来。踩了很多没有必要的坑&#xff0c;写出来给有用的人吧。 读卡器怎么用&#xff1f; 有个读卡器&#xff0c;一开始什么软件也不提供。我都不知道是干嘛…

Jupyter Notebook

2017年左右在大学里都听说过Jupyter Notebook&#xff0c;并且也安装用了一段时间&#xff0c;后来不知道什么原因没有用了。估计是那时候写代码的时候多一些&#xff0c;因为它可以直接写代码并运行结果&#xff0c;现在不怎么写代码了。 介绍 后缀名为.ipynb的json格式文件…

《YOLO算法:基础+进阶+改进》报错解决 专栏答疑

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。《YOLO算法&#xff1a;基础进阶改进》专栏上线后&#xff0c;部分同学在学习过程中提出了一些问题&#xff0c;笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容&#xff0c;笔者特意推出了该篇…

SpringBoot集成Camunda

一&#xff1a;SpringBoot集成 1.1&#xff1a;pom.xml 因camunda集成SpringBoot对SpringBoot的版本和JDK的版本都有一定的要求&#xff0c;所以这里贴个完整的依赖。可以去官网找每个SpringBoot的版本对应的camunda版本。 <?xml version"1.0" encoding"…

前端入门教程:学完即可单独完成前端项目

目录 目录 1.HTML: 1.1概念 1.2结构 1.3常见的标签使用分类&#xff1a; 2.CSS: 2.1概念 2.2样式实践&#xff1a; 以下的举例都来自于博客&#xff1a; 2.3css选择器&#xff1a; 什么是css选择器&#xff1a; 举例如下&#xff1a; 2.4Demo 3.JavaScript&#…

算法34:贴纸拼词(力扣691题)

题目&#xff1a; 我们有 n 种不同的贴纸。每个贴纸上都有一个小写的英文单词。 您想要拼写出给定的字符串 target &#xff0c;方法是从收集的贴纸中切割单个字母并重新排列它们。如果你愿意&#xff0c;你可以多次使用每个贴纸&#xff0c;每个贴纸的数量是无限的。 返回你…

vivado IP Revision Control

2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html

每日一题:LeetCode-LCR 007. 三数之和

每日一题系列&#xff08;day 18&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

linux高级篇基础理论十一(GlusterFS)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

VS中动态库的创建和调用

VS中动态库的创建和调用 库 ​ 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。库的存在形式本质上来说库是一种可执行代码的二进制。 ​ 库有两种&#xff1a;静态库&#xff08;.a、.lib&#xff09;和动态库&#xff08;.so、.dll&#xff09;。所谓静态…

一键操作完整的部署项目流程

目录 一、常见的搭配 二、完整的部署项目流程具体步骤 2.1、安装jdk 安装jdk &#xff1a; 配置环境&#xff1a; 检查是否成功&#xff1a; 2.2、配置tomcat外部访问 下载解压软件 安装tomcat 测试tomcat安装是否成功 2.3、安装MySQL 安装vcc环境 命令输入步骤 安…

应用在热能表领域中的数字温度传感芯片

热能表&#xff0c;是适用于测量在热交换环路中&#xff0c;被称作载热液体的液体所吸收或转换热能的仪器&#xff0c;它由流量传感器、温度传感器和热能积算仪三部分组成。热量表&#xff08;热表&#xff09;又称热能表、热能积算仪&#xff0c;既能测量供热系统的供热量又能…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息&#xff0c;与bridge相比&#xff0c;融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

K8S集群重新初始化--详细过程

K8S集群重新初始化 0、当前环境1、master节点1.1、在master节点执行下面reset命令&#xff1a;1.2、手动清除配置信息&#xff0c;这一步很关键&#xff1a;1.3、重新引导集群1.4、创建配置目录&#xff0c;并复制权限配置文件到用户目录下&#xff1a;1.5 查看集群状态1.6 安装…

小红书私信组件功能解读,商家如何使用

今年八月&#xff0c;小红书私信组件上新了两大新功能。新功能的出现&#xff0c;无疑为商家与消费者的沟通建联&#xff0c;提供了新的可能。今天我们来针对小红书私信组件功能解读&#xff01; 一、小红书私信组件新功能 这次小红书私信组件上新的两大功能分别是&#xff0c;…

GEE查看SMAP的L3级土壤水分产品并导出为TIFF

SMAP的L3级产品&#xff0c;时间分辨率为每日&#xff0c;空间分辨率为9KM&#xff0c;到2023年12月2日停止提供。 查看逐日的土壤水分变化 // 设置感兴趣区域&#xff08;Region of Interest&#xff09; var roi ee.FeatureCollection(projects/a-flyllf0313/assets/dacha…