C++核心高级编程 --- 1、内存分区模型 2、引用
文章目录
- 第一章:
- 1.内存分区模型
- 1.1 程序运行前
- 1.2 程序运行后
- 1.3 new操作符
- 第二章:
- 2.引用
- 2.1 使用
- 2.2 注意事项
- 2.3 做函数参数
- 2.4 做函数返回值
- 2.5 本质
- 2.6 常量引用
第一章:
1.内存分区模型
4个区域:
-
代码区:存放函数的二进制代码,由操作系统进行管理。
-
全局区:存放全局变量和静态变量以及常量。
-
栈区:由编译器自动分配释放,存放函数参数值,局部变量等。
-
堆区:由程序员分配和释放,程序员不释放的话,将由程序结束时操作系统回收。
意义:不同区域存放的数据,赋予不同生命周期,给程序员更大的空间去进行编程。
1.1 程序运行前
两个区域:
-
代码区:
存放CPU执行的机器指令。
代码区是共享的,目的是为了对频繁被执行的程序,在内存中只需有一份代码即可。
代码区是只读的,目的是为了防止程序被意外修改了它的指令。
-
全局区:
全局变量和静态变量,还包含了常量区,字符串常量和其他常量也存放在全局区。
全局区的数据在程序结束后由操作系统进行释放。
#include <iostream>
using namespace std;//全局变量
int g_a = 1;
int g_b = 1;//const修饰全局常量
const int c_g_a = 1;
const int c_g_b = 1;int main()
{//c - const g - global l - local//局部变量int a = 1;int b = 1;//静态变量static int s_a = 1;static int s_b = 1;//局部常量const int c_l_a = 1;const int c_l_b = 1;cout << "局部变量a的地址为:" << &a << endl;cout << "局部变量b的地址为:" << &a << endl;cout << "全局变量g_a的地址为" << &g_a << endl;cout << "全局变量g_b的地址为" << &g_b << endl;cout << "静态变量s_a的地址为:" << &s_a << endl;cout << "静态变量s_b的地址为:" << &s_b << endl;cout << "字符串常量的地址为:" << &"Hello" << endl;cout << "const修饰的全局常量c_g_a的地址为:" << &c_g_a << endl;cout << "const修饰的全局常量c_g_a的地址为:" << &c_g_b << endl;cout << "局部常量c_l_a的地址为:" << &c_l_a << endl;cout << "局部常量c_l_b的地址为:" << &c_l_b << endl;system("pause");return 0;
}
1.2 程序运行后
-
栈区:
由编译器自动分配释放,存放函数参数值,局部变量等。
不要返回局部变量的地址,因为栈区开辟的数据由编译器自动释放掉。
#include <iostream>
using namespace std;int* fun(int b)
{b = 2;int a = 1;return &a;
}int main()
{int* p = fun(10);cout << "fun函数返回的值为:" << *p << endl; //第一次打印正确的数字1,因为编译器做了保留。cout << "fun函数返回的值为:" << *p << endl; //第二次打印随机数system("pause");return 0;
}
-
堆区:
由程序员分配释放,如果程序员不释放,程序结束时由操作系统进行回收。
使用new在堆区进行开辟内存空间。
#include <iostream>
using namespace std;int* fun()
{int *p = new int(1); //指针也是局部变量,存放在栈区,但指针保存的数据存放在堆区return p;
}int main()
{int* p = fun();cout << "指针p指向的内容为:" << *p << endl;cout << "指针p指向的内容为:" << *p << endl;cout << "指针p指向的内容为:" << *p << endl;system("pause");return 0;
}
1.3 new操作符
作用:在堆区开辟数据。
语法结构:
-
开辟:new 数据类型
-
释放:delete 数据类型
使用new创建的数据,会返回该数据对于的类型指针。在堆区开辟的空间,需要程序员手动释放,释放使用操作符delete。
#include <iostream>
using namespace std;int* fun()
{int *p = new int(1);return p;
}void fun2()
{//在堆区开辟10个整型数据的数组int* arr = new int[10];for (int i = 0; i < 10; i++){arr[i] = i;}for (int i = 0; i < 10; i++){cout << arr[i] << " ";}cout << endl;delete[] arr;
}int main()
{int* p = fun();fun2();cout << *p << endl;cout << *p << endl;cout << *p << endl;delete p;return 0;
}
第二章:
2.引用
2.1 使用
作用:给变量起别名。
语法结构:数据类型 &别名 = 原名
#include <iostream>
using namespace std;int main()
{int a = 10;int& b = a;cout << "a = " << a << endl;cout << "b = " << b << endl;b = 20;cout << "a = " << a << endl;cout << "b = " << b << endl;system("pause");return 0;
}
2.2 注意事项
-
引用必须初始化
-
在初始化后不可修改
#include <iostream>
using namespace std;int main()
{int x = 10;int y = 20;//int& z; //报错int& z = x;z = y; //此处是赋值操作,而不是更改引用!cout << "x = " << x << endl; //20cout << "y = " << y << endl; //20cout << "z = " << z << endl; //20system("pause");return 0;
}
2.3 做函数参数
作用:函数传参的时候,使用引用的技术让形参修饰实参。可简化指针修改实参。
#include <iostream>
using namespace std;void swap(int &a , int &b)
{ int temp = a;a = b;b = temp;
}int main()
{int a = 10;int b = 20;swap(a, b);cout << "a = " << a << endl; //20cout << "b = " << b << endl; //10system("pause");return 0;
}
2.4 做函数返回值
作用:作为函数返回值所存在。
#include <iostream>
using namespace std;int& test1()
{int a = 10;return a;
}int& test2()
{static int a = 10;return a;
}int main()
{int& ret1 = test1();cout << "ret1 = " << ret1 << endl;cout << "ret1 = " << ret1 << endl;int& ret2 = test2();cout << "ret2 = " << ret2 << endl;cout << "ret2 = " << ret2 << endl;test2() = 20;cout << "ret2 = " << ret2 << endl;cout << "ret2 = " << ret2 << endl;system("pause");return 0;
}
补充:不要返回局部变量引用。
2.5 本质
在C++内部实现是一个指针常量。
#include <iostream>
using namespace std;void fun(int& ret) //转换为:int* const ret = &a;
{ret = 30; //转换为:*ret = 30;
}int main()
{int a = 10;int& ret = a; //自动转换为:int* const ret = &a;指针常量的指针指向不可改ret = 20;cout << "a = " << a << endl;cout << "ret = " << ret << endl; fun(a);system("pause");return 0;
}
2.6 常量引用
作用:修饰形参,防止误操作。
函数形参列表中,可加const修饰形参,以便防止形参改变实参。
#include <iostream>
using namespace std;void Show1(int& x)
{x = 20;cout << x << endl; //20
}void Show2(const int& x)
{x = 20; //报错cout << x << endl;
}int main()
{//int& ref = 10; //报错,引用本身需一个合法的内存空间//const int& ref = 10; //加入const,编译器会将代码修改成 int temp = 10;const int& ref = temp;//ref = 20; //报错,加了const变得只读,不可修改int a = 10;Show1(a);cout << a << endl; //20system("pause");return 0;
}
相关文章:

C++核心高级编程 --- 1、内存分区模型 2、引用
文章目录 第一章:1.内存分区模型1.1 程序运行前1.2 程序运行后1.3 new操作符 第二章:2.引用2.1 使用2.2 注意事项2.3 做函数参数2.4 做函数返回值2.5 本质2.6 常量引用 第一章: 1.内存分区模型 4个区域: 代码区:存放…...
winform日历控件_进度条控件
在 Windows Forms 应用程序中使用日历控件 (如 MonthCalendar 或 DateTimePicker) 和进度条控件 (如 ProgressBar) 是一个很好的练习,以了解这些控件的工作方式。以下是一些基本的步骤来实践这些控件: 日历控件: 添加 MonthCalendar 控件&am…...

Java进阶-反射的详解与应用
本文深入探讨了Java反射机制的核心概念、应用实例及其在现代Java开发中的重要性。文章首先介绍了反射的基本原理和能力,包括在运行时动态获取类信息、操作对象字段和方法的能力。随后,通过具体代码示例,展示了如何利用反射进行字段访问、方法…...

蓝桥杯算法题——暴力枚举法
先估算这个数小于3的50次方 cnt0 for i in range(50):for j in range(50):for k in range(50):a3**ib5**jc7**kif a*b*c<59084709587505:cnt1 print(cnt-1)#当ijk都为0时,a*b*c1不是幸运数字所以要减去...

【教程】Kotlin语言学习笔记(六)——泛型
写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…...

【中文视觉语言模型+本地部署 】23.08 阿里Qwen-VL:能对图片理解、定位物体、读取文字的视觉语言模型 (推理最低12G显存+)
项目主页:https://github.com/QwenLM/Qwen-VL 通义前问网页在线使用——(文本问答,图片理解,文档解析):https://tongyi.aliyun.com/qianwen/ 论文v3. : 一个全能的视觉语言模型 23.10 Qwen-VL: A Versatile…...

【Qt 学习笔记】Qt 背景介绍
博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt 背景介绍 文章编号:Qt 学习笔记 / 01 文章目录 Qt 背景…...
C++递推算法
数塔问题 #include<bits/stdc.h> using namespace std; void f(int,int,int); int a[100][100]; int n; int main() {cin>>n;for(int i0;i<n;i){for(int j0;j<1i;j){cin>>a[i][j];}}for(int in-2;i>0;i--){for(int j0;j<i1;j){a[i][j]a[i][j]ma…...

Go项目结构整洁实现|GitHub 3.5k
一、前言 hi,大家好,这里是白泽。今天给大家分享一个GitHub 🌟 3.5k 的 Go项目:go-backend-clean-arch https://github.com/amitshekhariitbhu/go-backend-clean-architecture 这个项目是一位老外写的,通过一个 HTT…...
Python读取PDF文字 去掉页眉页脚
使用PyMuPDF(即fitz)读取PDF中的text时,会把页码也读进来。所以,有时候就需要让程序忽略页眉和页脚,或者直接删除页眉和页脚。 根据fitz的文档:Page - PyMuPDF 1.24.0 documentation get_text的clip参数可…...

Linux:入门篇
文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么?4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手,不知道从何开始学习,相信这篇文章将会为你提供一个清晰的思路。…...

NSSCTF Round#20 Basic 真亦假,假亦真 CSDN_To_PDF V1.2 出题笔记 (附wp+源码)
真亦假,假亦真 简介:java伪造php一句话马。实则信息泄露一扫就出,flag在/flag里面。 题目描述:开开心心签个到吧,祝各位师傅们好运~ 静态flag:NSS{Checkin_h4v3_4_g00D_tINNe!} /路由显示 <?php e…...
处理关于 React lazy 白屏的两种方案
这篇文章是今天在阅读 React 官方文档的时候看到的一个关于 处理 lazy 体验问题的小技巧,在这里记录一下 当我们使用 React.lazy 去懒加载一个路由组件,在不做任何其他处理的情况下从其他页面首次进入到这个懒加载的路由页面时,肯定会出现白屏…...

Nginx 基础
文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…...

C++完美转发(适合小白)
我们知道,C中有左值引用和右值引用,首先我们要知道什么是左值什么是右值。 左值:表达式结束后依然存在的持久对象。左值可以出现在赋值语句的左边或右边。例如,变量和函数返回的引用都是左值。左值通常有持久的地址,可…...
如何创建自己的 Spring Boot Starter 并为其编写单元测试
当我们想要封装一些自定义功能给别人使用的时候,创建Spring Boot Starter的形式是最好的实现方式。如果您还不会构建自己的Spring Boot Starter的话,本文将带你一起创建一个自己的Spring Boot Starter。 快速入门 创建一个新的 Maven 项目。第三方封装的…...

C++ :STL中deque的原理
deque的结构类似于哈希表,使用一个指针数组存储固定大小的数组首地址,当数据分布不均匀时将指针数组内的数据进行偏移,桶不够用的时候会像vector一样扩容然后将之前数组中存储的指针拷贝过来,从原理可以看出deque的性能是非常高的…...

AttributeError: ‘Namespace‘ object has no attribute ‘EarlyStopping‘
报错原因 这个报错信息表明在Python脚本train.py中尝试访问命令行参数args.EarlyStopping时出错,具体错误是AttributeError: Namespace对象没有名为EarlyStopping的属性。 在Python的argparse模块中,当我们通过命令行传递参数并解析时,解析…...

深度学习pytorch——卷积神经网络(持续更新)
计算机如何解析图片? 在计算机的眼中,一张灰度图片,就是许多个数字组成的二维矩阵,每个数字就是此点的像素值(图-1)。在存储时,像素值通常位于[0, 255]区间,在深度学习中࿰…...

【edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法】
edge浏览器无法登录某些网站,以及迅雷插件无法生效的解决办法 edge浏览器无法登录某些网站,但chrome浏览器可以登录浏览器插件无法使用,比如迅雷如果重装插件重装浏览器重装迅雷后仍然出现问题 edge浏览器无法登录某些网站,但chro…...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...

关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...

VisualXML全新升级 | 新增数据库编辑功能
VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

Axure Rp 11 安装、汉化、授权
Axure Rp 11 安装、汉化、授权 1、前言2、汉化2.1、汉化文件下载2.2、windows汉化流程2.3、 macOs汉化流程 3、授权 1、前言 Axure Rp 11官方下载链接:https://www.axure.com/downloadthanks 2、汉化 2.1、汉化文件下载 链接: https://pan.baidu.com/s/18Clf…...

uni-app学习笔记二十七--设置底部菜单TabBar的样式
官方文档地址:uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容,通常写在项目的App.vue的onLaunch方法中,用于项目启动时立即执行 重要参数: indexnumber是tabBar 的哪一项&…...