c++之旅——第二弹

news2024/11/16 3:45:41

大家好啊,这里是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.coloradmin.cn/o/1486537.html

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

相关文章

2024-02学习笔记

1.当我们向Set集合中添加一个已经存在的元素时 当我们向Set集合中添加一个已经存在的元素时&#xff0c;Set集合会如何处理呢&#xff1f;实际上&#xff0c;Set集合不会将重复的元素添加到集合中。当我们向Set集合中添加一个元素时&#xff0c;Set集合会首先判断该元素是否已…

支持向量机 SVM | 线性可分:公式推导

目录 一. SVM的优越性二. SVM算法推导小节概念 在开始讲述SVM算法之前&#xff0c;我们先来看一段定义&#xff1a; 支持向量机(Support VecorMachine, SVM)本身是一个二元分类算法&#xff0c;支持线性分类和非线性分类的分类应用&#xff0c;同时通过OvR或者OvO的方式可以应用…

Sora:探索大型视觉模型的前世今生、技术内核及未来趋势

Sora&#xff0c;一款由OpenAI在2024年2月推出的创新性文生视频的生成式AI模型&#xff0c;能够依据文字说明&#xff0c;创作出既真实又富有想象力的场景视频&#xff0c;展现了其在模拟现实世界方面的巨大潜能。本文基于公开技术文档和逆向工程分析&#xff0c;全面审视了Sor…

一文搞懂浏览器缓存机制

文章目录 概述强制缓存协商缓存总结参考文章 概述 浏览器的缓存机制也就是我们说的HTTP缓存机制&#xff0c;其机制是根据HTTP报文的缓存标识进行的 浏览器第一次向服务器发送HTTP请求, 浏览器拿到请求结果后&#xff0c;会根据响应报文的缓存标识&#xff0c;决定是否进行缓存…

【学习总结】什么是DoS和DDoS

[Q&A] 什么是DoS DoS 是 “Denial of Service”&#xff08;拒绝服务&#xff09;的缩写&#xff0c;它是一种网络攻击方式&#xff0c;其目的是使目标计算机或网络资源无法为合法用户提供正常的服务。通过向目标系统发送大量请求、消耗其带宽、处理器或内存等资源&#…

【Linux网络命令系列】ping curl telnet三剑客

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

前后端分离vue+nodejs高校教室资源预约管理系统4e80m

本系统的设计与实现共包含9个表:分别是配置文件信息表&#xff0c;教师信息表&#xff0c;教室类型信息表&#xff0c;教室信息信息表&#xff0c;教室预约信息表&#xff0c;系统公告信息表&#xff0c;token表信息表&#xff0c;用户表信息表&#xff0c;学生信息表&#xff…

matplotlib散点图

matplotlib散点图 假设通过爬虫你获取到了北京2016年3, 10月份每天白天的最高气温(分别位于列表a, b), 那么此时如何寻找出气温和随时间(天)变化的某种规律? from matplotlib import pyplot as pltx_3 range(1, 32) x_10 range(51, 82)y_3 [11,17,16,11,12,11,12,6,6,7,8…

二、数据结构——单链表,双链表,栈,队列,单调栈,单调队列,KMP,Trie,并查集,堆,哈希表等内容。

对于链表来说&#xff0c;由于new操作时间太长&#xff0c;因此&#xff0c;算法题中一般使用静态链表。 1.单链表 采用数组实现单链表&#xff0c;可以直接开两个数据&#xff0c;一个数组存放数值&#xff0c;另外一个数据存放下一个元素&#xff08;指针&#xff09;。 示…

klipper api测试脚本whconsole.py

1、whconsole.py简单介绍 whconsole.py用于测试klipper的对外接口api&#xff0c;其实是连接klipper的uds服务&#xff08;Unix Domain Socket&#xff09;&#xff0c;官方也有介绍API 服务器 - Klipper 文档。 需要注意是的whconsole.py脚本启动不能使用Python3&#xff0c;…

想要调用淘宝开放平台API,没有申请应用怎么办?

用淘宝自定义API接口可以访问淘宝开放平台API。 custom-自定义API操作 taobao.custom 公共参数 注册账号获取API请求地址 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xf…

【计算机网络】深度学习HTTPS协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习HTTPS协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:HTTPS是什么二:HTTPS的工作过程三:对称加密四:非对称加密五:中间人攻击1…

精读《用 Babel 创造自定义 JS 语法》

1 引言 在写这次精读之前&#xff0c;我想谈谈前端精读可以为读者带来哪些价值&#xff0c;以及如何评判这些价值。 前端精读已经写到第 123 篇了&#xff0c;大家已经不必担心它突然停止更新&#xff0c;因为我已养成每周写一篇文章的习惯&#xff0c;而读者也养成了每周看一…

C++进阶(二) 多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c; 具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会 产生出不同的状态。举个栗子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学…

无人机镜头稳定的原理和相关算法

无人机的镜头稳定主要基于两个关键技术&#xff1a;镜头平衡技术和实时电子稳像。无人机镜头稳定的原理和相关算法主要是通过镜头平衡技术和实时电子稳像技术来保持摄像镜头的稳定性&#xff0c;从而拍摄出清晰、稳定的画面。无人机镜头稳定的原理主要是通过传感器和算法来实现…

基于SpringBoot的在线拍卖系统(附项目源码+论文)

摘要 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单管理、留言板管理、系统管理&#xff0c;用户&#xff1b;首页、个人中心、历史竞拍管理、竞拍订单管理、留言板管理&#xff0…

SSH教程

ssh 是远程连接的利器, 可以说凡是涉及到 linux 服务器, ssh 就是一个绕不开的话题. 本文作为一个教程, 尽可能详细的帮助读者设置 ssh, 并给出一些常用的 ssh 配置方法 (主要用于 linux 系统的远程登录和文件传输). 1. 简介 ssh 分为两个部分, sshd 服务端和 ssh 客户端. ssh…

2.2 mul、div、and、or乘除指令及所有寄存器英文名

汇编语言 1. mul乘指令 两个相乘的数&#xff0c;要么都是8位&#xff0c;要么都是16位 两个8位数相乘 一个默认放在al中&#xff0c;另一个放在8位reg或内存字节单元中8位乘法&#xff0c;结果默认放在ax中例如&#xff1a;计算100*10 100和10小于255&#xff0c;可以做8位…

优选算法|【双指针】|1089.复写零

目录 题目描述 题目解析 算法原理讲解 代码 题目描述 1089. 复写零 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就…

基于图数据库构建知识图谱平台应用实践

▏摘要 中信证券基于分布式图数据库StellarDB&#xff0c;替代国外开源图数据库产品&#xff0c;打造全新的企业级知识图谱平台&#xff0c;应用于同一客户集团画像、科创板关联发现、风险事件报告、全球企业关联图谱、产业链图谱、投研图谱、反洗钱与稽核图谱、元数据图谱等应…