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");}

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

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

相关文章

浅析TSN网络之车载以太网协议测试

TSN是一项从视频音频数据领域延伸至工业领域、汽车领域的技术。TSN最初来源于音视频领域的应用需求&#xff0c;当时该技术被称为AVB&#xff0c;由于针对音视频网络需要较高的带宽和最大限度的实时&#xff0c;借助AVB能较好的传输高质量音视频。 2012年&#xff0c;AVB任务组…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号标志识别软件(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的交通信号标志识别软件对于提升道路安全和自动驾驶技术发展具有重要意义。本篇博客详细阐述了如何利用深度学习构建一个交通信号标志识别软件&#xff0c;并提供了完整的实现代码。该软件基于先进的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YO…

自动化测试的10大误区!

自动化测试因提高效率&#xff0c;减少重复工作的特性而被广泛采用。然而&#xff0c;随着自动化测试的普及&#xff0c;自动化测试也面临一系列挑战和误解。 这些误区不仅影响了测试的有效性&#xff0c;还会导致一定的项目风险&#xff0c;为了确保自动化测试能够真正提升测…

MySQL误truncate截断后数据恢复2024.3.1

近期很多MySQL数据丢失情况&#xff0c;很多是人为误操作导致。MySQL数据库丢失可能由truncate截断表、delete删除表中数据行、delete删除表、delete删除库、操作系统rm删除数据库文件、硬盘坏道等情况导致。本案例是一个误截断表导致的丢失。 不管哪种情况&#xff0c;第一时…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

Cloud+Consul

Cloud整合Zookeeper代替Eureka-CSDN博客 Consul简介 Consul是一套开源的分布式服务发现和配置管理系统 What is Consul? | Consul | HashiCorp DeveloperConsul is a service networking solution that delivers service discovery, service mesh, and network security ca…

SQL面试题(2)

第一题 创建trade_orders表: create table `trade_orders`( `trade_id` varchar(255) NULL DEFAULT NULL, `uers_id` varchar(255), `trade_fee` int(20), `product_id` varchar(255), `time` varchar(255) )ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_…

力扣-H指数

问题 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&#xff09…

点燃技能火花:探索PyTorch学习网站,开启AI编程之旅!

介绍&#xff1a;PyTorch是一个开源的Python机器学习库&#xff0c;它基于Torch&#xff0c;专为深度学习和科学计算而设计&#xff0c;特别适合于自然语言处理等应用程序。以下是对PyTorch的详细介绍&#xff1a; 历史背景&#xff1a;PyTorch起源于Torch&#xff0c;一个用于…

YOLOv9:使用可编程梯度信息学习您想学习的内容

摘要 arxiv.org/pdf/2402.13616.pdf 当今的深度学习方法侧重于如何设计最合适的目标函数,以便模型的预测结果能最接近于实际结果。同时,还必须设计一个适当的架构,以便于获取足够的预测信息。现有的方法忽略了一个事实,即当输入数据经历层层特征提取和空间变换时,会损失…

Java基于springboot的厨艺交流平台的设计与实现代码

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功…

WINDOWS内存管理 - 返回状态值

DDK大部分函数的返回值类型是NTSTATUS类型。查看DDK.h文件&#xff0c;可以看到 typedef LONG NTSTATUS; NTSTATUS的定义和LONG等价。为了函数的形式统一&#xff0c;所有函数的返回值都是NTSTATUS类型。NTSTATUS就是一个32位的整数&#xff0c;其每位有着不同的含义&#xf…