C++引用,四区和函数

2023-11-16

代码区、全局区、堆区和栈区

注意:

  • 其中代码区和全局区是运行前的,栈区和堆区是运行后的。即如果exe文件不运行,就没有栈区和堆区

代码区

: 保存程序编程exe文件后的代码,存放的CPU执行的机器指令

代码区的特点

  • 代码区是共享的,目的是对于频繁被执行的程序,只需要在内存中有一份代码
  • 代码区是只读的,防止程序意外地修改了它的指令

全局区

特点

  • 全局变量,静态变量常量存放在这里
  • 全局区还包含了常量区,字符串常量和其他常量也存放在这里,常量区中存放const修饰的全局变量和字符串常量
  • const修饰的局部变量不在全局区里,const修饰的全局变量在全局区里
  • 该区域的数据在程序结束后操作系统释放

栈区

特点

  • 由编译器自动分配释放,存放函数的参数值,局部变量等
    注意
  • 不要返回局部变量的地址

堆区

特点

  • 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收,在c++中主要利用new在堆区开辟内存

new操作符

特点

  • 堆区开辟的数据,由程序员手动开辟,手动释放,释放利用操作符delete,
  • 利用new 创建的数据,会返回该数据对应的类型的指针

引用

概述:给变量取别名
注意事项

  • 引用在创建的时候必须被初始化
  • 引用在初始化后,不可以再改变
int a;
int &b;//不能这样写
int &b=a;//写成这样

引用做函数参数

  • 函数传参时,可以利用引用的技术让形参修饰实参
  • 优点:可以简化指针修改实参

引用做函数的返回值

  • 引用可以用做函数的返回值
  • 注意不要返回局部变量引用
  • 用法:函数调用作为左值

引用的本质

本质引用的本质在c++内部实现是一个指针常量

#include<iostream>
using namespace std;

//发现是引用,转换成 int* const ref=&a;
void func(int& ref) {
	ref = 10;  //ref是引用,转换成 *ref =100
}

int main() {
	int a = 10;

	//自动转换成 int* const ref=&a; 指针常量是指针指向不可修改,也说明为什么引用不可更改
	int& ref = a;
	ref = 20;  //内部发现ref是引用,自动帮我们转换为:*ref=20

	cout << "a:" << a << endl;
	cout << "ref:" << ref << endl;

	func(a);
	return 0;
}

常量引用

作用:常量引用主要用来修饰形参,防止误操作,在函数形参列表中,可以加const修饰形参,防止形参改变实参

代码如下

#include<iostream>
using namespace std;

void showvalue(const int& v) {
	cout << v << endl;
}
int main() {
	//int &ref=10; 引用本身需要一个合法的内存空间,所以这行错误
	//加入const就可以了,编译器优化代码,int temp=10; const int& ref=temp;
	const int& ref = 10;

	//加入const后,就不可以修改变量
	cout << ref << endl;

	//函数中利用常量引用防止误操作修改实参
	int a = 10;
	showvalue(a);
	return 0;
}

函数的默认参数

概述: 在c++中,函数的形参列表是可以有默认值的
解释在代码中

#include<iostream>
using namespace std;

int func(int a, int b = 10, int c = 10) {
	return a + b + c;
}
//如果有某个位置参数有默认值,那么从这个位置往后,从左向右,必须都要有默认值
//如果函数声明有默认值,函数实现的时候就不能有默认参数
int func2(int a = 10, int b = 10);
int func2(int a, int b) {
	return a + b;
}

int main() {
	cout << "ret=" << func(20, 20) << endl;
	cout << "ret=" << func(100) << endl;

	return 0;
}

函数的占位参数

概念: c++中函数的形参列表可以有占位参数,用来占位,调用函数时必须填补该位置

#include<iostream>
using namespace std;
//函数占位参数,占位参数也可以有默认参数
void func3(int a, int) {
	cout << "this is func" << endl;
}

int main() {
	func3(10, 10); //占位参数必须填补
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++引用,四区和函数 的相关文章

随机推荐

  • 基于github搭建的个人博客

    刚开始我也是很不理解为什么要利用github hexo搭建博客 现在差不多能理解 首先逼格很高 其次用github搭建可以学习使用github并且空间很大 也可以便于交流 再次声明本篇是基于windows系统下搭建的博客 废话不多说开始 搭
  • 借助Redis锁,完美解决高并发秒杀问题

    目录 1 单机环境下的锁 2 分布式情况下使用Redis锁 3 一台服务宕机 导致无法释放锁 4 给每一把锁加上过期时间 5 延长锁的过期时间 解决锁失效 6 使用Redisson简化代码 场景 一家网上商城做商品限量秒杀 1 单机环境下的
  • JAVA-注册成功后,通过多线程发送短信的使用场景

    场景 在日常的系统中 使用前的第一步往往是需要注册 只有注册后获得登录账号和密码才能正常使用系统 有些系统在注册成功后 还会往用户的手机发送一条注册成功的短信通知 这个并不属于主线流程 也就是说发不发送该短信通知 用户都已经能登录系统了 那
  • mapbox创建自定义marker图标绑定弹框展示信息

    创建自定义marker图标绑定弹框 let carMarker 存放marker图标 for let m 0 m
  • 怎么查看本地服务器信息,查看本地服务器url地址

    查看本地服务器url地址 内容精选 换一换 OBS Browser 是一款用于访问和管理对象存储服务的图形化工具 支持通过配置内网DNS服务器地址的方式 使在华为云上的Windows ECS通过内网直接访问OBS 下面将介绍具体其操作流程和
  • Android EditText的setOnEditorActionListener方法——监听软键盘按键

    文章目录 1 控件EditText的setOnEditorActionListener方法的使用 2 android 软件盘事件响应 android imeOptions KeyEvent android inputType 2 1 Edi
  • 修改NuGet下载包后存放的默认路径

    NuGet默认下完包后就放在C盘 我们给他改一下 NuGet的默认目录配置文件在C Users yourName AppData Roaming NuGet NuGet Config 加一下这个配置 我放在了D盘 你可以看情况自己改
  • 【Hadoop技术篇】hadoop的使用

    博主介绍 博主介绍 大家好 我是淼淼 喵 很高兴认识大家 主攻领域 大数据开发 数据仓库 ETL 数据分析 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 欢迎评论 作者水平有限 欢迎各位大佬指点 相
  • 沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly

    3 6 softmax回归的从零开始实现 运行 print evaluate accuracy net test iter 报了一溜错误 其中最后一行为 RuntimeError DataLoader worker pid s 5052 1
  • 包和 jar 文件的创建

    前言 在之前的文章中 讲到了面向的 3 大特性 封装 继承 多态 和面向对象设计的 5 大原则 SRP OCP LSP DIP ISP 此外 我们还讲了如何创建一个类 并且在创建类后如何构造一个对象 然后还介绍了类中的属性和方法 并对构造方
  • 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍 GPS原理与接收机设计 谢钢 非线性方程 就是因变量与自变量之间的关系不是线性的关系 这类方程很多 例如平方关系 对数关系 指数关系 三角函数等等 求解此类方程往往
  • ESP-NOW:竟然还有如此好用的无线通信方式

    用 Arduino 玩转 ESP32 系列历史文章目录 ESP32 概述与 Arduino 软件准备 ESP32 GPIO接口编程入门 蓝牙翻页笔 蓝牙键盘与PPT 控制器 B 站粉丝计数器 Siri 语音识别控制 LED 灯 Siri 语
  • eclipse 关于报错Error creating bean with name ‘xxxxx‘: Invocation of init method....

    网上查找的资料是这种异常一般都是包导错了 缺失 冲突 版本错误都可能 由于再报这个错之前我进行了添加删除修改pom xml文件 右键项目 gt maven gt update project project gt clean等这些对于项目整
  • C语言模拟实现atoi函数

    atoi函数 主要功能是将一个字符串转变为整数 例如将 12345 gt 12345 但在实现过程中 我们难免会因为考虑不够全面而漏掉比较重要的几点 今天就总结一下实现atoi函数需要注意的地方 1 指针为NULL 2 字符串为空字符串 3
  • etcd的简单使用

    etcd的简单使用 ETCD安装配置 安装 去https github com coreos etcd releases 下载想要的版本解压etcd包 解压后进入目录 增加x权限 chmod x etcd chmod x etcdctl 并
  • MySQL5.7安装报错:GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM

    根据官方文档使用yum安装MySQL5 7 添加mysl comunity repo如下 mysql57 community name MySQL 5 7 Community Server baseurl http repo mysql c
  • [Docker]进入容器命令

    docker exec it api bin bash docker exec it api bin sh
  • JVM入门教程

    文章目录 简介 1 Java内存区域 1 1 程序计数器 1 2 Java虚拟机栈 1 3 本地方法栈 1 4 Java堆 1 5 方法区 1 6 运行时常量池 1 7 直接内存 2 HotSpot虚拟机 2 1 对象的创建 2 2 对象的
  • MyISAM和InnoDB区别关联详解

    Mysql架构 什么存储引擎 MySQL和InnoDB对比1 2 总结 Mysql存储架构 从上图可以发现 MySQL由以下几部分组成 连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 缓冲 Cache 组件 插件
  • C++引用,四区和函数

    引用变量 四区 函数 没有函数重载 代码区 全局区 堆区和栈区 代码区 全局区 栈区 堆区 new操作符 引用 函数的默认参数 函数的占位参数 代码区 全局区 堆区和栈区 注意 其中代码区和全局区是运行前的 栈区和堆区是运行后的 即如果ex