c++之旅——第二弹

大家好啊,这里是c++之旅第二弹,跟随我的步伐来开始这一篇的学习吧!

如果有知识性错误,欢迎各位指正!!一起加油!!

创作不易,希望大家多多支持哦!

一、内存四区

在系统为程序开辟内存时,为了方便分配和管理内存,将程序的内存区域划分为4块,分别为:

栈区:存放函数的形参、局部变量等。由编译器自动分配和释放,当函数执行完毕时自动释放。

堆区:用于动态内存的申请与释放,一般由程序员手动分配和释放,若程序员不释放,则程序结束时由操作系统回收。

全局静态常量区(全局区):存放常量(一般是字符串常量和其他常量)、全局变量和静态变量,在程序结束后由操作系统释放。

代码区:存放可执行的代码。

数据区:包括栈区,堆区,全局静态常量区

代码区作用示例:

定义了一个结构体类型,然后在主函数中使用该类型定义一个变量,那么从底层角度来看系统是怎么知道这个结构体类型有什么基本数据类型从而进行使用呢?这就是代码区的作用了,因为定义结构体的代码会存储到代码区,用于让系统知道结构体内的数据类型。

二.C语言中的动态内存开辟:

1.什么是动态内存开辟:

动态内存开辟就是使用户可以根据自己的需要,向系统申请所需大小的内存空间并通过指针进行管理

2.C语言中的动态内存开辟:

以下函数使用时都需要包含头文件stdlib.h。

(1)使用malloc函数:

malloc(int size);//用于分配一个大小为size的内存区域。

(2)使用colloc函数:

calloc(unsigned int n,int size);//用于分配n个大小为size的连续内存区域,并初始化为0

(3)使用realloc函数:

realloc(void * p,unsigned int size);例如:用于重新分配(追加)已经通过malloc函数或calloc函数开辟的内存空间,可以改变其内存空间的大小

(4)使用free函数:

void free(void * p);

释放的时候,指针必须指向该堆区内存的首地址

用于释放指针变量p所指向的动态内存空间,使得这部分空间能被其他变量使用,否则这段内存空间需要等到程序结束后才会被释放。

每次使用完动态内存空间的时候需要释放内存空间。如果不释放,会导致内存泄漏(以后无法使用此空间)。内存泄漏会导致程序运行时占用的内存逐渐增加,直到达到系统可用内存的上限。

示例:

int *p = (int*)malloc(sizeof(int) * 10);    //申请10个int大小的内存    
for (int i = 0; i < 10; i++)    
{        *(p + i) = i + 1;    
}    
for (int i = 0; i < 10; i++)    
{        
    printf("%d\t", *(p + i));    
}    printf("\n");    
//1       2       3       4       5       6       7       8       9       10    
//正常的输出    
p = (int*)calloc(5, sizeof(int));   //重新分配5个int大小的内存,并初始化为0    
for (int i = 0; i < 10; i++)    
{        
    printf("%d\t", *(p + i));    
}    
printf("\n");    
//0       0       0       0       0       -33686019       -86947674       7843    13418400        13388992    
//前面5个是正常的,后面5个越界访问,所以是未知的值    
//越界访问是不可取的操作,越界操作的内存,你可以认为是不属于你的东西,不属于你的那么你就不应该去使用它    
realloc(p, sizeof(int) * 10);   //重新分配10个int大小的类型    
for (int i = 0; i < 10; i++)    
{        
    printf("%d\t", *(p + i));    
}    
printf("\n");    
//0       0       0       0       0       -842150451      -842150451      -842150451      -842150451      -842150451    
//前面5个是正常的,后面5个没有初始化,所以是未知的值,并且由于前面五个都是0,说明是追加的函数        
free(p);//free函数使用时必须指针指向首地址,否则会报错。

C语言中malloc和calloc函数本质上是一样的,可以混着用。

realloc函数追加的内存不一定是和原来内存连续的,而有可能是逻辑上的连续,因为在使用完开始的内存后,后面的内存也可能会继续被其他代码使用。

三、C++中的动态内存开辟:

1.new和delete:

new在c++中相当于C语言中的malloc,delete相当于C语言中的free

C语言中的是函数,C++中的开辟内存使用的是关键字或者运算符

new可以开辟各种数据类型,结构体也可以

为了避免指针使用时的错误,如下细节需要注意到:

(1),定义指针初始化为空值(NULL)

(2),记得在使用完指针开辟的内存后写delete释放内存,否则会造成内存泄漏,积累会导致堆区内存越来越小

(3),写完delete之后再赋值为空

注意点:指针变量大小是四个字节(一般),因为一般是32位系统。

new了一个连续内存时,赋值操作是通过循环解引用指针来进行赋值的

四,结构体指针:

结构体指针的使用方式:

1:定义结构体指针指向结构体变量

例如:假设有结构体类型为student

student stu;

student *p1=&stu;

2:定义堆区的结构体类型内存来通过结构体指针来进行管理

student *p2=new student;

3.在定义结构体变量时,C语言中struct关键字是不可以省略的,而在c++中则可以省略,直接用结构体名字

五,多重指针(分为多级指针和多维指针,目前讲多级指针):

1.使用举例:

void main()

{

int *p=new int[10];

int **p1=&p;

for(int i=0;i<10;i++)

{

*(p+i)=i+1;

}

delete[] p;

}

以上的赋值操作可以使用二级指针来进行代替操作:

for(int i=0;i<10;i++)

{

*(( *p1)+i)=i+1;

}

2.写法一点注意点:

在c++和C语言中size_t是unsigned int 类型的宏替换

3.使用函数及二级指针来进行堆区内存的开辟(为什么使用函数开辟内存时要使用二级指针来进行内存的开辟呢,因为此时使用一级指针相当于之前的值传递而非地址传递)代码示例:

void fun(int **p,size_t n)

{

*p=(int *)malloc(n);

}

void main()

{

int *pArr=NULL;

fun(&pArr,10*sizeof(int));

free(pArr);

}

4.使用多级指针来写动态二维数组:

动态变化的二维数组首先想到的是往数组中括号内填入变量,通过改变变量的值实现动态变化,但填入变量是不支持的,所以想到二级指针。

int row=3,col=4;

int **pArr=new int *[row];

for(int i=0;i<row;i++)

{

     *(pArr+i)=new int [col];

}

for(int i=0;i<row;i++)

{

   for(int j=0;j<col;j++)

      {

          *( *(pArr+i)+j)=i *col+j+1;

      }

}

for(int i=0;i<row;i++)

{

      for(int j=0;j<col;j++)

          {

              printf("%d\t",pArr[i] [j]);

          }

      printf("\n");

}

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

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

相关文章

等概率事件算法

1等概率的生成(0-8)范围内的正整数 // Math.random 数据范围[0,1) 且 是 等概率的产生随机数 // 应用&#xff1a; // 1.生成等概率的整数&#xff08;等概率的生成(0-8)范围内的正整数 int value (int) (Math.random() * 9); System.out.println("value "…

Python 教学平台,支持“多班教学”的课程授课方式|ModelWhale 版本更新

龙行龘龘、前程朤朤&#xff0c;ModelWhale 新一轮的版本更新&#xff0c;期待为大家带来更优质的使用体验。 本次更新中&#xff0c;ModelWhale 主要进行了以下功能迭代&#xff1a; 新增 课程&#xff08;包括课件、作业、算力&#xff09;按班级管理&#xff08;团队版✓ …

基于Google Vertex AI 和 Llama 2进行RLHF训练和评估

Reinforcement Learning from Human Feedback 基于Google Vertex AI 和 Llama 2进行RLHF训练和评估 课程地址&#xff1a;https://www.deeplearning.ai/short-courses/reinforcement-learning-from-human-feedback/ Topic: Get a conceptual understanding of Reinforcemen…

程序员的金三银四求职宝典!

目录 ​编辑 程序员的金三银四求职宝典 一、为什么金三银四是程序员求职的黄金时期&#xff1f; 二、如何准备金三银四求职&#xff1f; 1. 完善简历 2. 增强技术能力 3. 提前考虑目标公司 4. 提前准备面试 三、程序员求职的常见面试题 1. 数据结构和算法 2. 数据库 …

文件系统制作

文章目录 什么是文件系统如何制作根文件系统文件添加登录密码文件系统制作Squashfs制作方式gzip & lzo & xz 压缩 Jffs2制作方式 Ubi文件系统 什么是文件系统 Linux文件系统中的文件是数据的集合&#xff0c;文件系统不仅包含着文件中的数据而且还有文件系统的结构&am…

el-input组件当数据为空时, 边框变红,并提示错误信息

1&#xff0c;样式 初始&#xff1a; 当不输入口令&#xff0c; 点击确定时&#xff1a; 2, 思路 主要是使用动态类的方式。 先设置输入框变红的样式以及提示文字的样式class 对于样式class 用变量来控制是否奏效。 3&#xff0c; 代码实现 //html&#xff1a; <div cl…

数据结构-----反射

文章目录 反射1.定义2 用途(了解)3 反射基本信息4 反射相关的类&#xff08;重要&#xff09;4.1 Class类(反射机制的起源 )4.1.1 Class类中的相关方法(方法的使用方法在后边的示例当中) 4.2 反射示例4.2.1 获得Class对象的三种方式4.2.2 反射的使用 5、反射优点和缺点6 重点总…

七、基于FreeRTOSSTM32移植MQTT

1、移植环境 (1)Keil MDK: V5.38.0.0 (2)STM32CubeMX: V6.8.1 (3)MCU: STM32F407ZGT6 (4)已移植好FreeRTOS和调试好串口的项目。 FreeRTOS移植参考博客&#xff1a;示例1&#xff1a;FreeRTOS移植详解_基于HAL库工程_hal库移植rtos-CSDN博客mqttclient源码&#xff1a;htt…

如何自学python

Python是一种高级编程语言,它具有简单易学、可读性强、可移植性好、功能丰富等优点,因此在许多领域都被广泛使用,如科学计算、数据分析、人工智能、Web开发、游戏开发等等。 Python具有丰富的标准库和第三方库,可以帮助程序员快速开发功能强大的应用程序。同时,Python也具…

免费下载全网视频系列:一键下载央视视频

之前分享过全网视频下载工具下载视频不求人&#xff0c;免费下载全网视频&#xff0c;今天再分享几个下载央视视频的工具。 第一个是央视频4k下载器&#xff0c;比如下载这个视频https://www.yangshipin.cn/#/video/home?vidv0000313oqb&#xff0c;打开工具在命令行输入 v00…

Vue.js+SpringBoot开发在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

[技巧]Arcgis之图斑四至范围批量计算

ArcGIS图层&#xff08;点、线、面三类图形&#xff09;四至范围计算 例外一篇介绍&#xff1a;[技巧]Arcgis之图斑四至点批量计算 说明&#xff1a;如下图画出来的框&#xff08;范围标记不是很准&#xff09; &#xff0c;图斑的x最大和x最小&#xff0c;y最大&#xff0c;…

社区店经营实战策略:如何打造火爆生意并持续盈利?

在竞争激烈的商业环境中&#xff0c;经营一家成功的社区店需要一套全面而有效的策略。作为一名开鲜奶吧5年的创业者&#xff0c;我将分享一些关键的经营策略&#xff0c;帮助你打造火爆生意并实现持续盈利。 1、 市场调研&#xff1a; 在开店之前&#xff0c;深入了解你所在社…

内存占用构造方法

#使用虚拟内存构造内存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #释放消耗的虚拟内存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #内存占用可直接在/dev/shm目录下写文件

#WEB前端(表单)

1.实验&#xff1a; form、input、label 登录界面&#xff0c;表单填写界面 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

【Linux】基本指令(中)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) man指令 语法:man [选项] 命令 功能:Linux的命令有很多参数&#xff0c;我们无法全部记忆的话&#xff0c;就可以通过man指令查看联机手册获取帮助。…

递归与回溯2

一&#xff1a;递归分治 什么是递归&#xff1f; 函数自己调用自己通过函数体来进行循环以自相似的方法重复进行的过程 递归的过程&#xff1a;先自顶向下找到递归出口&#xff0c;在自底向上回到最初的递归位置 推导路径未知的题目只能用递归不能用循环 比如求多叉树的节点&…

SpringBoot+Jwt+Redis

大致流程&#xff1a; 参照&#xff1a; 史上最全面的基于JWT token登陆验证_完整的基于jwt的登陆认证-CSDN博客 springboot整合JWTRedis_springboot jwt redis-CSDN博客

【QT+QGIS跨平台编译】之六十二:【QGIS_CORE跨平台编译】—【错误处理:未定义类型QgsPolymorphicRelation】

文章目录 一、未定义类型QgsPolymorphicRelation二、解决办法一、未定义类型QgsPolymorphicRelation 报错信息: 错误原因为,使用了未定义类型 QgsPolymorphicRelation 二、解决办法 QgsRelation.h文件中 ①注释第36行: //class QgsPolymorphicRelation;②注释第414行: …

构建大语言模型的四个主要阶段

大规模语言模型的发展历程虽然只有短短不到五年的时间&#xff0c;但是发展速度相当惊人&#xff0c;国内外有超过百种大模型相继发布。中国人民大学赵鑫教授团队在文献按照时间线给出 2019 年至 2023 年比较有影响力并且模型参数量超过 100 亿的大规模语言模型。大规模语言模型…