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

在这里插入图片描述

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

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

指针形参

void reset(int *p)
{
	*p=0;//p指向的整型对象变为0
	 p=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.引用和指针

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NPN PNP SS8050 SS8550 S8050

SS8050的使用及引脚判断方法 今天讲的是NPN型三极管SS8050&#xff0c;主要分为以下几个方面&#xff1a; 一、前言 二、SS8050简介 三、NPN三极管与PNP三极管 四、三极管管脚识别方法 五、不拆卸三极管判断其好坏 六、S8050和SS8050的区别 七、三极管与MOS管的区别 八…

Modern C++ std::mutex底层原理

前言 我时常有这样的疑问&#xff1a; std::mutex怎么就能保证后面的语句100%安全哪&#xff1f;CPU reordering就不会把这些语句重排到mutex前面执行&#xff1f;而且各个CPU都是有L1、L2缓存的&#xff0c;如果mutex后面要访问的的变量在这些缓存中怎么办&#xff1f; 带着…

开启鸿蒙开发探索之旅ArkTS基本语法介绍(3)

上一章简单的介绍了鸿蒙HUAWEI DevEco Studio框架的搭建&#xff0c;这一章讲一下鸿蒙的主要开发一眼ArkTS的基本语法结构 1.ArkTS语法解释 ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&…

信道编码理论【信息论安全】

目录 一. 信道编码模型 二. 信道编码速率与错误译码率 2.1 信道编码速率 2.2 平均错误率 三. 信道容量 四. 小结 一. 信道编码模型 &#xff08;1&#xff09;消息 假定消息集合为M&#xff0c;如下&#xff1a; &#xff08;2&#xff09;编码 将消息m映射成码字&…

怎么在PDF添加文本框?6种快速向PDF添加文字教程

有时您可能希望填写表格或在 PDF 文件中留下评论。这需要您将文本框和文本添加到 PDF。文本框是一个文本字段&#xff0c;您可以在其中键入文本。但是&#xff0c;除非您使用专用的 PDF 编辑器&#xff0c;否则编辑 PDF 文件具有挑战性。了解正确的 PDF 工具和将文本框添加到 P…

松木和桉木建筑模板:它们的性能和用途有何区别?

在建筑行业中&#xff0c;选择合适的模板材料对于保证施工质量和效率至关重要。松木和桉木是两种常用的建筑模板材料&#xff0c;它们各有特点和优势。特别是桉木&#xff0c;在某些方面相比松木有显著的优势。 松木建筑模板的特点 松木因其广泛的可用性和经济性而被广泛应用…

软件工程各种图

参考视频&#xff1a; 6 分钟学会 UML 类图_哔哩哔哩_bilibili 5 分钟学会 UML 时序图&#xff08;顺序图、序列图&#xff09;_哔哩哔哩_bilibili 3 分钟学会 UML 活动图_哔哩哔哩_bilibili 6 分钟学会 UML 用例图_哔哩哔哩_bilibili 是真的讲的非常好&#xff01;&#…

高保真度与流畅度MagicVideo-V2视频生成模型;3D人形虚拟角色;微调量化的扩散模型;自动给视频配音;非自回归音频生成

本文首发于公众号&#xff1a;机器感知 高保真度与流畅度MagicVideo-V2视频生成模型&#xff1b;3D人形虚拟角色&#xff1b;微调量化的扩散模型&#xff1b;自动给视频配音&#xff1b;非自回归音频生成 MagicVideo-V2: Multi-Stage High-Aesthetic Video Generation 本文提…

找不到msvcr120.dll怎样修复,分享4种修复方法

msvcr120.dll是Microsoft Visual C 2012 Redistributable Package的一个关键组件&#xff0c;负责提供C运行时库。许多应用程序在运行时都需要依赖这个库文件。然而&#xff0c;在日常使用过程中&#xff0c;不少用户会遇到msvcr120.dll丢失的问题&#xff0c;导致程序无法正常…

【PaperReading】3. PTP

Category Content 论文题目 Position-guided Text Prompt for Vision-Language Pre-training Code: ptp 作者 Alex Jinpeng Wang (Sea AI Lab), Pan Zhou (Sea AI Lab), Mike Zheng Shou (Show Lab, National University of Singapore), Shuicheng Yan (Sea AI Lab) 另一篇…

SpringBoot中使用SpringRetry实现重试机制(重试调用第三方API)

场景 SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)&#xff1a; SpringbootFastJson实现解析第三方http接口json数据为实体类(时间格式化转换、字段包含中文)_fastjson 发送http请求 接收实体,出现日期转换异常-CSDN博客 在调用…

中国社科院与新加坡社科大联合培养博士——快节奏,慢城市

现在都市生活都很快&#xff0c;小城市虽然节奏慢&#xff0c;但是相对来说&#xff0c;很多人反而愿意选择去快节奏的大城市&#xff0c;首先就是很现实的问题&#xff0c;薪资待遇&#xff0c;其次就是大城市缴纳的社会保险等到退休那一天会比在小城市多一点&#xff0c;为什…

postman使用-06断言

文章目录 一、断言定义二、 常用的断言三、断言-状态码&#xff08;1&#xff09;单一状态码断言&#xff1a;Status code:Code is 200 检查返回的状态码是否为200原始模板&#xff1a;修改后&#xff1a;括号里的200也可以改成自己要断言的状态码具体步骤&#xff1a;断言成功…

制造业CRM是什么?都有哪些特色功能?

近些年&#xff0c;制造业和别的行业一样&#xff0c;经历过翻天覆地的转型。从以分销为基础到客户至上&#xff0c;所有行业都在确定商业模式的全局性变化。在这样的环境下&#xff0c;不管什么规模的设备制造企业都意识到将创新与技术融进业务流程的必要性。CRM管理系统是促进…

Windows安装Rust环境(详细教程)

一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio&#xff0c;但该工具占用空间大安装也较为麻烦&#xff0c;可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub&#xff1a;Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…

C++力扣题目257--二叉树的所有路径

给你一个二叉树的根节点 root &#xff0c;按 任意顺序 &#xff0c;返回所有从根节点到叶子节点的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,null,5] 输出&#xff1a;["1->2->5","1->3"]示例 …

如何进行大数据系统测试

大数据系统常见的架构形式有如下几种&#xff1a; Hadoop架构&#xff1a; Hadoop Distributed File System (HDFS)&#xff1a;这是一种分布式文件系统&#xff0c;设计用于存储海量数据并允许跨多台机器进行高效访问。 MapReduce&#xff1a;作为Hadoop的核心计算框架&#…

1.5 Unity中的数据存储 PlayerPrefs

Unity中的三种数据存储&#xff1a;数据存储也称为数据持久化 一、PlayerPrefs PlayerPrefs是Unity引擎自身提供的一个用于本地持久化保存与读取的类&#xff0c;以键值对的形式将数据保存在文件中&#xff0c;然后程序可以根据关键字提取数值。 PlayerPrefs类支持3种数据类…

php中常用的几个安全函数

1. mysql_real_escape_string() 这个函数对于在PHP中防止SQL注入攻击很有帮助&#xff0c;它对特殊的字符&#xff0c;像单引号和双引号&#xff0c;加上了“反斜杠”&#xff0c;确保用户的输入在用它去查询以前已经是安全的了。但你要注意你是在连接着数据库的情况下使用这个…

UG装配-动态干涉检查

如果设计的产品有运动部件&#xff0c;除了做静态干涉检查外&#xff0c;通常还要做动态干涉检查 动态检查可以使用如下命令&#xff1a;移动组件&#xff0c;序列 在动态干涉检查前&#xff0c;先装配好组件&#xff0c;并且是可运动状态 在使用移动组件命令对运动部件进行…