C++总结笔记(四)—— 堆栈区域划分与引用实例解析

文章目录

  • 前言😀
  • 一、概念
    • 1.1. 内存分区
      • 1.1.1 堆区
      • 1.1.2 栈区
      • 1.1.3 程序代码区
      • 1.1.4 全局/静态存储区
      • 1.1.5 常量存储区
    • 1.2. 引用
  • 二、程序示例
  • 总结


前言😀

在C++的内存管理中,堆区和栈区是一个非常重要的概念,理解堆栈的相关知识,会对如何访问内存以及对内存中内容的调用都会有一个比较清晰的认识。而引用是一个对堆栈进行调用的实例,可以用引用的相关原理加深对堆栈的理解。

一、概念

下面对内存分区和引用的的分类和概念进行简析。

1.1. 内存分区

在各种资料中对内存区域的划分都有所不同,三分类,四分类,五分类都有。
三分类:静态(全局)存储区;栈区;堆区;
四分类:栈区;堆区;全局区(包含全局/静态存储区和常量存储区);代码区;
五分类:全局/静态存储区;栈区;堆区;常量存储区;程序代码区;
个人觉得用五分区比较全面。

1.1.1 堆区

堆区按照程序分配与释放原则可以这样定义:
是由程序猿🙈进行分配和释放内存的,若程序猿啊🙉不释放,程序结束时操作系统会进行回收。
那么哪些变量会存在堆区呢?
利用new关键字在内存上分配内存,用delete释放。

int* Stack()
{int* p = new int(1);//new返回的是堆区中值为1的地址return p;
}int main()
{	int* p = Stack();cout << *p << endl;delete p;
}

1.1.2 栈区

同样按照程序分配与释放原则:由编译器自动分配和释放内存。
函数的形参局部变量都会存在在栈区。
注意:在创建函数时不要返回局部变量的地址,因为局部变量在函数调用完后会自动释放。

1.1.3 程序代码区

存放所有二进制代码的区域,由操作系统进行管理,在程序运行前存在。
代码区有共享只读两个属性。

1.1.4 全局/静态存储区

在声明全局变量和静态变量时,这两种变量会被分配到同一内存区域中。

//全局变量
int a = 1;int main()
{//局部变量int b = 2;//静态变量static int c = 3;cout << (int)&a << endl;cout << (int)&b << endl;cout << (int)&c << endl;
}
13017144
11926456
13017148

可以看出:全局变量和静态变量在一个内存区域,局部变量在栈区中。

1.1.5 常量存储区

显而易见:存储常量的区域。包括字符串常量和全局常量。注意局部常量在局部变量的区域中。

//全局常量
const int a = 1;
//全局变量
int b = 1;int main()
{	//字符串常量cout << (int)&"A" << endl;cout << (int)&a << endl;cout << (int)&b << endl;
}
3832628
3832624
3842048

1.2. 引用

C++中引用实际上是指针常量,我们知道指针常量的概念:可以修改值,但不能改指向。所以引用就是给变量声明另外一个名字,按照指针常量的概念,可以修改内存中的值,但是不能让引用指向另外的内存。
引用用&符进行引用的定义。

    int a = 1;int c = 1;int &b = a;b = 2;//int& b = c;错误cout << b << endl;

二、程序示例

//传递引用
void Add(int &a, int &b)
{cout << a + b << endl;
}
//返回引用
int& Add1()
{static int c = 0;//静态变量在堆中不会被释放。return c;
}
//避免a和b的值被更改
int Add2(const int &a, const int &b)
{return a+b;
}int main()
{	int a = 1;int b = 2;Add(a, b);int& d = Add1();cout << d << endl;cout << d << endl;Add1() = 1;cout << d << endl;const int& f = 1;//常量引用int k = Add2(a, b);cout << k << endl;
}
3
0
0
1

总结

本文参考了如下资料:

c++堆栈–黑马程序员笔记
C/C++程序内存的分配
C++的引用&

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

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

相关文章

学习Android MediaPlayer

Android Media Playback 原文 The Android multimedia framework includes support for playing variety of common media types, so that you can easily integrate audio, video and images into your applications. You can play audio or video from media files stored in…

spark2.0.1 安装配置

1. 官网下载 wget http://d3kbcqa49mib13.cloudfront.net/spark-2.0.1-bin-hadoop2.7.tgz 2. 解压 tar -zxvf spark-2.0.1-bin-hadoop2.7.tgz ln -s spark-2.0.1-bin-hadoop2.7 spark2 3. 环境变量 vi /etc/profile #Spark 2.0.1export SPARK_HOME/usr/local/spark2export PATH…

Spring Cloud各组件超时

Ribbon的超时 全局设置&#xff1a; ribbon:ReadTimeout: 60000ConnectTimeout: 60000局部设置&#xff1a; service-id:ribbon:ReadTimeout: 1000ConnectTimeout: 1000其中&#xff0c;service-id 是Ribbon所使用的虚拟主机名&#xff0c;一般和Eureka Server上注册的服务名称…

【图像处理】——遍历图像所有像素的方法(for 循环和np.where遍历)应用在模板制作

目录 具体np.where的用法可以参见: 其他遍历图像的所有像素的方法: 模板制作流程 Python代码

C++总结笔记(五)——构造函数和析构函数

文章目录前言一、基本概念1 构造函数2 析构函数二、示例1. 构造函数和析构函数的简单使用2. 拷贝构造函数的调用3. 浅拷贝和深拷贝前言 本文讲述了构造函数和析构函数的概念以及对应的示例&#xff0c;以便加深理解。 一、基本概念 1 构造函数 构造函数用于初始化类的对象&a…

LINUX 更新

sudo apt-get dist-upgrade,更新所有的软件转载于:https://www.cnblogs.com/jackieron/p/5997805.html

python实战===如何优雅的打飞机

这是一个打飞机的游戏&#xff0c;结构如下&#xff1a; 其中images中包含的素材为 命名为alien.png 命名为ship.png 游戏效果运行是这样的&#xff1a; 敌军&#xff0c;也就是体型稍微大点的&#xff0c;在上方左右移动&#xff0c;并且有规律向下移动。我军目标&#xff0c;…

【图像处理】——上采样、下采样、在模板匹配中的金字塔加速策略

目录 1、下采样 Python自带函数 自定义函数 Python实现下采样 2、上采样 Python自带函数 自定义函数<

C++总结笔记(六)——友元

文章目录前言一、基本概念二、程序示例1.全局函数调用私有成员2. 外部类调用私有成员3. 外部类的成员函数调用私有成员总结前言 一、基本概念 友元是C中为了方便类外的类或者函数访问类内私有成员而定义的一种特殊语法&#xff0c;用friend关键字进行修饰。 二、程序示例 友…

Java默认类型,类型转换,常量与变量笔记

默认类型&#xff1a; 在java里整数默认是int类型&#xff0c;小数默认是double类型&#xff0c;单个字符默认是char类型&#xff0c;true、false自然默认的是boolean类型&#xff0c;字符串默认的是String类型。 变量和常量类型转换&#xff1a; 因为有默认类型&#xff0c;在…

【图像处理】——Python实现灰度特征提取

目录 1、灰度特征 2、Python代码 1、灰度特征 2、Python代码 import cv2 import numpy as npdef gray_features(img):hist = cv2.calcHist([img],[0],None,[256],[0,255])#得到全局直方图统计数据

C++总结笔记(七)—— 运算符重载

文章目录一、概念二、程序示例1. 加减乘除重载2. 赋值运算符重载3. 递增递减运算符重载4. 关系运算符重载5. 左移运算符重载6. 函数调用运算符重载一、概念 C中运算符重载是为了实现对象之间进行各种运算的特定语法&#xff0c;在某些特定的场合起到重要的作用&#xff0c;新建…

asp.net 加载xml到menu

XML File <?xml version"1.0" encoding"utf-8" ?> <Area iAreaID "0" cAreaName"城市"><Province iAreaID "1" cAreaName"北京市"/><Province iAreaID "2" cAreaName"上海…

前端lvs访问多台nginx代理服务时出现404错误的处理

前端lvs访问多台nginx代理服务时出现404错误的处理 环境描述&#xff1a;app --> lvs --> nginx --> server app访问页面购买流量页面(nginx服务器)代理到后端和服务器交互(多台server)刚开始访问没有问题&#xff0c;流量变大为了避免出现问题&#xff0c;nginx配置了…

使用numpy出现DeprecationWarning: The normed argument is ignored when density is provided. 解决方法忽略警告的方法

目录 1、从根本上进行解决 2、直接利用warning模块忽略警告 1、从根本上进行解决 “DeprecationWarning: The normed argument is ignored when density is provided. In future passing both will result in an error.” 这种一般是因为函数库或者是一些包package版本更新而…

iptables四个表与五个链间的处理关系

转载自&#xff1a;http://www.linuxidc.com/Linux/2012-08/67505.htm netfilter/iptables IP 信息包过滤系统是一种功能强大的工具&#xff0c;可用于添加、编辑和除去规则&#xff0c;这些规则是在做信息包过滤决定时&#xff0c;防火墙所遵循和组成的规则。 这些规则存储在专…

C++总结笔记(八)—— 菱形继承

文章目录一、基本概念二、程序举例1. 虚继承2. 内在逻辑一、基本概念 菱形继承是指存在两个子类继承自同一个基类&#xff0c;同时有子类继承这两个子类。 二、程序举例 1. 虚继承 使用虚继承可以解决菱形继承资源浪费的问题&#xff0c;因为有两个子类继承基类&#xff0c…

Linux命令:mkdir

全称&#xff1a;make directories 用途&#xff1a;创建新目录 格式&#xff1a;mkdir [OPTION]... DIRECTORY... 类型&#xff1a;mkdir is hashed (/bin/mkdir) 说明&#xff1a; 创建文件目录&#xff0c;较常用的选项参数有两个&#xff1a; -m, --modeMODE&#xff1a;直…

InnoDB引擎与MyIASM的一点总结

InnoDB引擎&#xff1a; 提供了对数据库ACID事务的支持&#xff0c;并且实现了SQL标准的四种隔离级别 提供了行级锁和外键约束。 它的设计的目标是处理大容量数据库系统&#xff0c;用于缓冲数据和索引。 不支持FULLTEXT类型的数据&#xff0c;没有保存表的行数&#xff0c;当s…

C++总结笔记(九)—— 多态

文章目录一、多态是什么&#xff1f;二、使用步骤2.1. 静态多态2.1.1 函数重载2.1.2 模板2.2.动态多态2.2.1 示例2.2.2 原理分析总结一、多态是什么&#xff1f; 多态是面向对象的语言中都必须掌握的特性&#xff0c;其概念简单讲就是对同一种特性的方法有不同的实现功能&…