C++语法 内存区域 和 引用

代码区

存放函数体的二进制代码 由操作系统进行管理

全局区 

存放全局变量和静态变量以及常量 存放全局变量 静态变量 常量(字符串常量 全局const常量)

栈区

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

堆区

由程序员分配和释放 若程序员不释放程序结束的时候由操作系统回收 cpp 中使用new进行开辟内存

new操作符

c++中利用new操作符在堆区开辟内存 需要程序员手动释放。

#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
int *func() {int *p = new int(10);return p;
}
void test1() {int *array = new int[10];for (int i = 0; i < 10; i++) {array[i] = 100 + i;}for (int i = 0; i < 10; i++) {std::cout << array[i] << std::endl;}// 释放数组需要在变量前➕一个【】delete[] array;
}
int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";test1();int * p = func();std::cout << *p << std::endl;std::cout << *p << std::endl;std::cout << *p << std::endl;std::cout << *p << std::endl;delete p;std::cout << *p << std::endl;return 0;
}Hello, World!
10
10
10
10
-559071216
Program ended with exit code: 0

引用

给变量起别名

语法 数据类型 &别名 = 原名

#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";int a = 10;int &b = a;std::cout << "a=" << a << "b=" << b << std::endl;b = 100;std::cout << "a=" << a << "b=" << b << std::endl;//引用必须初始化//int &c;int d = 20;b = d; //赋值操作并不是更改引用std::cout << "a= " << a << "b="  << b << "d  = " << d  << std::endl;return 0;
}

注意

引用必须要初始化

引用初始化后就不可以更改

引用做函数参数

作用 函数传参时可以利用引用的技术让形参修改实参

优点 可以简化指针修改实参

通过引用参数产生的 效果和按地址传递是一样的 引用的语法更清楚简单

//
//  main.cpp
//  cpplearn
//
//  Created by KING on 2024/2/1.
//#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
void swapNum(int a,int b) {int temp = a;a = b;b = temp;
}void swapNum2(int* a,int* b) {int temp = *a;*a = *b;*b = temp;
}
void swapNum3(int &a,int &b) {int temp = a;a = b;b = temp;
}int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";int a = 10;int b = 20;swapNum(a, b);std::cout << "a=" << a << "b=" << b << std::endl;swapNum2(&a, &b);std::cout << "a=" << a << "b=" << b << std::endl;swapNum3(a, b);std::cout << "a=" << a << "b=" << b << std::endl;return 0;
}

引用做函数返回值

不要返回局部变量的引用

Reference to stack memory associated with local variable 'a' returned
#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
int& test03() {int a = 10; /// 局部变量在栈区return a;
}
int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";int &a =  test03();std::cout << "a=" << a << std::endl;return 0;
}

 

函数的调用可以作为左值

//
//  main.cpp
//  cpplearn
//
//  Created by KING on 2024/2/1.
//#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
int& test04() {static int a = 10; /// 局部变量在栈区return a;
}
int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";int &a =  test04();std::cout << "a=" << a << std::endl;std::cout << "a=" << a << std::endl;test04() = 1000;std::cout << "a=" << a << std::endl;std::cout << "a=" << a << std::endl;return 0;
}Hello, World!
a=10
a=10
a=1000
a=1000
Program ended with exit code: 0

引用的本质

引用的本质在cpp中就是一个指针常量

常量引用

用来修饰形参防止误操作

//
//  main.cpp
//  cpplearn
//
//  Created by KING on 2024/2/1.
//#include <iostream>
#include "mathutil.hpp"
#include <string>
using namespace std;
void printNum(int &num) {std::cout  << num << std::endl;num = 100;
}
void printNum2(const int &num) {std::cout  << num << std::endl;//num = 100;//Cannot assign to variable 'num' with const-qualified type 'const int &'
}int main(int argc, const char * argv[]) {// insert code here...std::cout << "Hello, World!\n";// 引用必须引用一块合法的内存空间//int &a = 20;// 加上const 之后 这里相当于 编译器将代码修改为 int temp = 10; const int &ref = temp;const int &ref = 10; //  加入const 之后变为只读不可以修改// 引用本质是指针常量 指针常量 特点是 不能修改指向 只能修改指针保存地址的值int num = 22;printNum(num);std::cout  << num << std::endl;int num2 = 20;printNum2(num2);return 0;
}

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

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

相关文章

【论文笔记】Multi-Chain Reasoning:对多思维链进行元推理

目录 写在前面1. 摘要2. 相关知识3. MCR方法3.1 生成推理链3.2 基于推理链的推理 4. 实验4.1 实验设置4.2 实验结果 5. 提及文献 写在前面 文章标题&#xff1a;Answering Questions by Meta-Reasoning over Multiple Chains of Thought论文链接&#xff1a;【1】代码链接&…

【数据分享】1929-2023年全球站点的逐日最高气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01; 之前我们分享过1929-2023年全球气象站…

Git 怎么设置用户的权限

在团队协作的软件开发中&#xff0c;对于版本控制系统Git来说&#xff0c;确保代码与数据的安全性至关重要。为了实现这一目标&#xff0c;Git提供了灵活且可定制的用户权限管理机制。下面将简单的探讨一下Git如何设置用户的权限&#xff0c;以及如何保护代码和数据。 用户身份…

Nginx 多项目部署,vue刷新404 解决方案

网上找的资料大多都解决不了&#xff0c;废话不多说直接告诉你解决方法。 环境是 TP6 VUE前端官网 VUE 后台管理 部署 两个项目 刷新 404 解决方案 Nginx 配置 直接贴图 如果解决了&#xff0c;给我顶起来&#xff0c;让更多人 快速的解决。

南京观海微电子---如何减少时序报告中的逻辑延迟

1. 引言 在FPGA逻辑电路设计中&#xff0c;FPGA设计能达到的最高性能往往由以下因素决定&#xff1a; ▪ 工作时钟偏移和时钟不确定性&#xff1b; ▪ 逻辑延迟&#xff1a;在一个时钟周期内信号经过的逻辑量&#xff1b; ▪ 网络或路径延迟&#xff1a;Vivado布局布线后引…

element-ui button 组件源码分享

element-ui button 源码分享&#xff0c;基于对源码的理解&#xff0c;编写一个简单的 demo&#xff0c;主要分三个模块来分享&#xff1a; 一、button 组件的方法。 1.1 在方法这块&#xff0c;button 组件内部通过暴露 click 方法实现&#xff0c;具体如下&#xff1a; 二、…

如何使用 Supabase Auth 在您的应用程序中设置身份验证

在本文中&#xff0c;您将学习基本的关键概念&#xff0c;这些概念将帮助您掌握身份验证和授权的工作原理。 您将首先了解什么是身份验证和授权&#xff0c;然后了解如何使用 Supabase auth 在应用程序中实现身份验证。 &#xff08;本文内容参考&#xff1a;java567.com&…

Open CASCADE学习|球面上曲线长度计算

球和球面是数学和物理学中非常重要的概念&#xff0c;它们在许多领域都有广泛的应用。 球面是指所有与固定点等距离的点的集合&#xff0c;这个固定点被称为球心&#xff0c;而这个等距离的长度就是球的半径。球面是一个二维曲面&#xff0c;它是三维空间中点与距离之间关系的…

Docker容器引擎(5)

目录 一.docker-compose docker-compose的三大概念&#xff1a; yaml文件格式&#xff1a; json文件格式&#xff1a; docker-compose 配置模板文件常用的字段&#xff1a; 二.Docker Compose 环境安装&#xff1a; 查看版本&#xff1a; 准备好nginx 的dockerfile的文…

AS-V1000产品介绍:支持GA/T1400视图库标准(可通过GA/T1400接入海康、华为、大华等图传前端设备,实现图传功能)

目 录 一、概述 二、AS-V1000视频监控管理平台的特点 二、视频监控平台通过GA/T1400接入前端设备 &#xff08;一&#xff09;接入华为GA/T1400前端设备 &#xff08;二&#xff09;接入大华GA/T1400前端设备 &#xff08;三&#xff09;接入海康威视GA/…

杂题——试题-算法训练-P0602

分析&#xff1a; 把要重排序的数字转成数组对数组进行排序&#xff0c;从小到大排序数组转成字符串&#xff0c;字符串转成数字&#xff0c;得到最小数再把最小数的字符串反转&#xff0c;得到最大数注意&#xff1a; 在java语言中&#xff0c;如果使用Arrays.toString(digits…

EasyExcel根据对应的实体类模板完成多个sheet的写入与读取

1.展示模板一的实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowH…

问题:第十三届全国人民代表大会第四次会议召开的时间是()。 #经验分享#知识分享#媒体

问题&#xff1a;第十三届全国人民代表大会第四次会议召开的时间是&#xff08;&#xff09;。 A. 2018年3月3日至3月11日 B. 2019年3月5日至3月11日 C. 2020年3月5日至3月11日 D. 2021年3月5日至3月11日 参考答案如图所示 问题&#xff1a;顾客满意是顾客对一件产品满足…

失物招领|基于Springboot的校园失物招领系统设计与实现(源码+数据库+文档)

校园失物招领系统目录 目录 基于Springboot的校园失物招领系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、 管理员功能实现 (1) 失物招领管理 (2) 寻物启事管理 (3) 公告管理 (4) 公告类型管理 2、用户功能实现 (1) 失物招领 (2) 寻物启事 (3) 公告 …

【日常总结】宝塔中 Gitlab服务器 forbidden

一、场景 二、问题 三、原因 四、解决方案 五、实战 Stage 1&#xff1a;打开 /etc/gitlab/gitlab.rb&#xff0c;并编辑 Stage 2&#xff1a;重启gitlab服务 Stage 3&#xff1a;测试&#xff08;打开girlab网页&#xff09; 六、后续 一、场景 公司更换新电脑 服务…

使⽤COCO数据集训练YOLOX

注意&#xff1a; 训练的时候&#xff0c;如果GPU不够&#xff0c;可以修改batchsize大小。 (yolox) xuefeif123:/mnt/d/BaiduNetdiskDownload/CV/YOLOX$ ls LICENSE README.md assets checkpoints demo exps requirements.txt setup.py tools yolox M…

C语言——P/文件操作

一、为什么使用文件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久…

数据结构—动态查找表

动态查找介绍 1. 动态查找的引入&#xff1a;当查找表以线性表的形式组织时&#xff0c;若对查找表进行插入、删除或排序操作&#xff0c;就必须移动大量的记录&#xff0c;当记录数很多时&#xff0c;这种移动的代价很大。 2. 动态查找表的设计思想&#xff1a;表结构本身是…

web前端开发--------阴影与转换

1.阴影分为文本阴影和盒子阴影 我们使用text-shadow属性为文本添加阴影效果&#xff0c;使用结构伪类为第一个子元素p添加阴影效果&#xff1b; 水平偏移量为负值时&#xff0c;表示阴影向左偏移&#xff1b; &#xfeff;垂直偏移量为负值时&#xff0c;表示阴影向上偏移。 …

【Vue】2-14、插槽 自定义指令

一、插槽 插槽&#xff08;Slot&#xff09;是 vue 为组件的封装者提供的能力。允许封装者在封装组件时&#xff0c;把不确定的&#xff0c;希望由用户指定的部分定义为插槽。 <template><div class"app-container"><h1>App 根组件</h1>&…