数据结构(一)C语言补

  • 数据结构

    • 内存空间划分

      • 一个进程启动后,会生成4G的内存空间

      • 0~3G是用户空间(应用层) 3~4G是内核空间(底层)

        • 0~3G

        • 3~4G

      • 所有的进程都会共享3G~4G的内核空间, 但是每个进程会独立拥有0~3G的用户空间。

      • 栈区

        • 存放数据特点

          • 栈区存放数据的申请空间的先后顺序:从大到小

          • 先进后出,后进先出(电梯)(未优化前)

            • int a; -> &a = 0x01 int b; -> &b = 0x00

      • 堆区

        • 存放数据特点

          • 先进先出,后进后出(排队)

          • 栈区存放数据的申请空间的先后顺序:从小到大

            • int a; -> &a = 0x00 int b; -> &b = 0x01

    • 动态内存分配和回收

      • malloc

        • 格式

          • void *malloc(size_t size)

            • 使用时需强转为其他基本数据类型

            • size为需要申请空间的字节大小, 以字节为单位,可以借助sizeof()

          • int *p = (int *)malloc(sizeof(int) * n)

            • 在堆区获取n个4字节大小的空间,并将首地址赋值给p

      • free

        • 格式

          • void free(void *p)

            • p为获取内存的起始地址

          • free(int *p)

            • 释放p为首地址的堆区内存

      • 野指针

        • 未初始化或已经释放的,并没有置空的指针。

          • 定义指针,未初始化就直接使用

          • 使用指针申请了堆区空间,而堆区空间已经释放,指针没有重新指向,成为野指针

          • 使用指针指向数组,可以通过指针遍历数组里的元素,如果越界访问成为野指针。

    • 传址,传值,值返回,址返回

      • 左值

        • 可以放在等号左边和右边,有地址空间 比如:变量,堆区空间

      • 右值

        • 只能放在等号的右边,没有地址空间, 比如:常量、临时值、表达式结果

      • 传值

        • 将变量或者数据作为函数的实参传递给形参,形参的改变,一定不影响实参,因为只是将实参的数据复制一份给形参。根本原因:存储地址不同

      • 传址

        • 将变量或者数据的地址作为函数的实参传递给形参,形参的改变,可能会影响实参,具体看代码

          • (*p)++

            • 对地址p存储的值进行自增

              • 改变主函数的实参

          • *p++

            • 取值后对地址自增

      • 返值

        • 一个函数返回一个数据(值返回),返回结果为常量,只能为右值

      • 返址

        • 一个函数返回一个数据的地址(地址返回) 返回的数据生命周期够长,返回结果就可以为左值

    • const

      • 该变量不可被改变,只读变量,常变量

      • const 修饰的全局变量,在静态区的.ro段,const修饰局部变量,存在栈区。

      • const修饰的变量,一定要初始化。

        • 因为cosnt修饰的值不可变,故而不能对其进行赋值操作

      • const修饰整型

        • int a = 10;

        • const int b = 20; // == int const b = 20;

        • 不可使用未被const修饰的指针指向常量

          • 否则会报错

      • const 和指针

        • 如果想保存常变量地址的话,就需要对指针加以限制

        • int * const p;

          • 表示指针的指向不可变,指向里的值可变。

        • int const *p;

          • 表示指针指向里的值不可变,指向可变。

        • int const * const p;

          • 都不可变

    • typedef

      • 概念

        • 将数据类型重新起个名字,目的是将代码简化

      • 格式

        • typedef 数据类型 新名

        • typedef int * P

          • 将数据类型int * 重定义为P

          • P p; == int *p;

      • 已有数据类型

        • 用已有类型定义变量

          • int a; //定义一个整型变量

          • int *ptr; //定义一个整型指针

          • int arr[5]; //定义一个数组

          • int *p[5]; //定义一个指针数组

          • int (*p2)[3]; //定义一个数组指针

          • int (*fun)(int,int); //定义一个函数指针

          • int **ptr2; //定义一个二级指针

        • 提取类型

          • int

            • 整型

          • int *

            • 整型指针

          • int [5]

            • 整型数组

          • int *[5]

            • 整型指针数组

          • int (*)[5]

            • 整型数组指针

          • int (*)()

            • 函数指针

          • int **

            • 二级指针

        • 用已有类型重定义

          • typedef int A

          • typedef int *A

          • typedef int A[]

          • typedef int *A[]

          • typedef int (*A)[]

          • typedef int **A

    • define

      • 概念

        • 是一种预处理指令,用来定义常量、函数、循环等。

        • 宏就是个常量,宏只做替换,不做计算,不做正确性的检查。

          • 不运算直接原样传过去

        • 在C语言中,宏的定义和输出不用格式符%s,而是直接使用宏本身作为标识符,主要原因,在预处理就是做个简单的替换,而不是在运行时执行函数调用。

      • 格式

        • #define 宏名 宏体

          • 将宏体定义为宏名

        • #define N10

          • 预处理时将程序中的宏名N替换为宏体10

      • 带参宏

        • #define max(x,y) x>y?x:y

          • int a = max(++x,y)

      • 条件编译

        • 判断宏是否成立

          • #if 条件 printf(); #else printf(); #endif

        • 判断宏是否存在

          • #ifdef 宏名 printf(); #else printf(); #endif

          • #ifndef 宏名 printf(); #else printf(); #endif

    • struct

      • 概念

        • 结构体是一种用户自定义的数据类型,用于存储相同或者不同的数据的构造数据类型

      • 格式

        • struct + 结构名 { 数据类型 成员1; 数据类型 成员2; ··· 数据类型 成员n; };

          • 给结构体中的成员赋值

            • s1.name = “张三”;

              • 数组只能在初始化时整体赋值

              • 其他情况需要使用strcpy(s2.name, "李四") 或gets()

          • 间接初始化和赋值

            • 先定义结构体类型,然后在主函数内进行初始化或赋值

              • struct student s1;

          • 直接初始化和赋值

            • 在定义结构体类型的同时,将变量直接放在结构体类型后面进行定义

              • 直接初始化,可以省略结构名, 省略后不可在结构体外定义结构体变量

              • 若省略结构名,将只能使用已有的结构体变量,

          • 初始化

            • 按顺序初始化

              • struct student s1 = {“jack”,1001,21};

              • 数据和结构体内的数据类型一一对应

            • 不按顺序初始化

              • struct studen s2= {.id = 1002, .age = 22, .name = "Tom"}

                • 通过引出结构体内部的成员进行赋值操作,

        • 注意事项

          • struct 定义结构体的关键字

          • {}不可省略

          • 结构名要符合命名规则,可以省略

          • 成员的数据类型可以是基本类型也可以是构造数据类型

          • 结构体中的成员个数任意,根据代码进行设计

          • 结构体的声明可以放在任意位置,但是一般放在头文件中

          • 定义结构体类型时不占用空间,使用结构体变量时需要申请空间

      • 结构体数组

        • 数组

          • 一次性定义多个数据类型相同的变量

        • 一次性定义多个类型相同的结构体变量

          • 间接初始化结构体数组

          • 直接初始化结构体数组

      • 结构体指针

        • 结构体指针,用来存储结构体变量的地址

        • 子主题 2

      • 嵌套结构体

        • c语言不支持在一个结构体里嵌套另一个结构体 ,只有编译器优化后才可

        • 嵌套的结构体需要一层一层访问

          • T1.s2.a

      • 结构体的大小

        • 结构体的大小满足字节对齐的原则

          • 可以提高处理效率

          • 保证每一次都能取出完整的数据

        • 字节对齐规则

          • 结构体的每一个成员变量的存储位置(相对于结构体中第一个成员的偏移量),必须对齐在其整数倍上

          • 结构体整体的大小,必须是最大对齐成员对齐量的整数倍

          • 成员对齐量=成员本身的大小>操作系统的对齐量?操作系统的对齐量:成员本身的大小 (操作系统的对齐量:32位默认4Byte对齐,64位默认8Byte对齐)

      • 带位域的结构体对齐

    • 共用体/联合体

      • union

        • 格式

          • union 共用体名 { 数据类型 成员1; 数据类型 成员2; ··· 数据类型 成员n; };

        • 特点

          • 一个成员发生修改,另一个成员也跟着修改

        • 取值赋值初始化和结构体类似

        • 共用体大小仍然满足对齐规则

          • 若全成员全为基本类型数据类型 那么共用体就和基本数据类型中最大的成员的大小一致

          • 若共用体中有构造类型的成员,那么共用体的大小需要满足,是共用体中最大基本类型成员的整数倍

    • 枚举

      • 基本数据类型

        • 枚举项的值为整型常量,之间用空格隔开

        • 未初始化则从零开始,间隔为1

      • 格式

        • enum 枚举名 { 枚举项1, 枚举项2, ··· 枚举项n };

          • 枚举项可以直接拿来用,不需要有枚举变量

          • 枚举项默认有值,第一个枚举项从零开始,依次递增1

          • 若中间某个项赋值了,则后面的枚举项值从这个数开始依次递增1

          • 枚举变量也可直接给变量(包括枚举变量)赋值,相当于一个常量

          • 枚举变量也可使用常量赋值,但是会失去枚举的意义,建议枚举变量直接使用枚举项赋值

      • 枚举项的使用

        • 可以直接当成变量使用,也可使用枚举项给枚举变量赋值,但枚举项不可在枚举外赋值

      • 应用场景

        • 作为函数的参数传递

        • 枚举常和switch ·· case 语句联合使用

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

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

相关文章

小学vr虚拟课堂教学课件开发打造信息化教学典范

在信息技术的浪潮中,VR技术正以其独特的魅力与课堂教学深度融合,引领着教育方式的创新与教学方法的变革。这一变革不仅推动了“以教促学”的传统模式向“自主探索”的新型学习方式转变,更为学生带来了全新的学习体验。 运用信息技术融合VR教学…

C++那些事之小项目实战-进程间通信

小项目实战之进程间通信 进程间通信是一个非常重要的话题,特别是像一些大型项目都有它的影子,例如:PostgreSQL使用了管道完成copy的进程间通信,那么本节也将基于这个主题,使用C去搭建一个进程间通过管道通信的demo出来…

【代码随想录】【算法训练营】【第53天】 [739]每日温度 [496]下一个更大元素I [503]下一个更大元素II

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 48,周六,不能再坚持~ 题目详情 [739] 每日温度 题目描述 739 每日温度 解题思路 前提:寻找任一个元素的右边比自己大的元素的位置 思路:通常…

(三十一)Flask之wtforms库【剖析源码下篇】

每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心组成员、华为云享专家Python全栈领域博主、CSDN原力计划作者 🔥🔥本文已收录于Flask框架从入门到实战专栏:《Flask框架从入…

spring boot初始化的几个总结

spring intializr File->New->Project 注意:Spring Initializer中 Java版本选择模块已经不支持1.8了。 Spring Boot 3.x要求 Java最低版本为17, 最新的SpringBoot版本已经要求Java22了 所以,你可以升级Java版本,使用Spri…

6.26.3 基于Transformer的深度神经网络在数字乳腺断层合成图像上的乳腺癌分类

开发一种有效的深度神经网络模型,该模型结合了相邻图像部分的上下文,以检测数字乳腺断层合成(DBT)图像上的乳腺癌。 数字乳房断层合成(DBT)是一种医学成像技术,其中检测器围绕患者以有限角度旋转并记录多幅图像。然后将这些图像重建为二维(2D…

【Python】变量与基本数据类型

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言变量声明变量变量的命名规则 变量赋值多个变量赋值 标准数据类型变量的使用方式存储和访问数据:参与逻辑运算和数学运算在函数间传递数据构建复杂的数据结构 NameE…

关于5G和卫星

手机,已经串联起了我们生活中的一切环节。我们随时随地拿出手机,都能畅快地上网。 这一切是如此地理所当然,以至于我们甚至想不到这样不可思议的问题: 移动通信网络真的无处不在吗? 我们都知道,地球虽叫…

WordPress主题大前端DUX v8.7源码下载

全新:用户注册流程,验证邮箱,设置密码 新增:列表显示小视频和横幅视频 新增:文章内容中的外链全部增加 nofollow 新增:客服功能中的链接添加 nofollow 优化:产品分类的价格显示

Day05-讲师列表前端-讲师信息添加

代码&#xff1a; //添加讲师 addTeacher(teacher){ return request({ url:/eduservice/teacher/addTeacher, method:‘post’, data:teacher }) } &#xff08;2&#xff09;在页面实现调用 代码&#xff1a; 讲师添加 <el-button type“primary” :disabled“sav…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分&#xff0c;它是Qt的一个核心类&#xff0c;用于处理不同数据类型之间的转换和传递。…

Elasticsearch集群部署(下)

目录 上篇&#xff1a;Elasticsearch集群部署&#xff08;上&#xff09;-CSDN博客 七. Filebeat 部署 八. 部署Kafka 九. 集群测试 链接&#xff1a;https://pan.baidu.com/s/1AFXSmDdY5xBb7g35ipKoaw?pwdfa9m 提取码&#xff1a;fa9m 七. Filebeat 部署 为什么用 F…

使用 draw.io 画图

尽管我非常喜欢 wps 和 office 的 ppt 画图&#xff0c;但因为它们对数学公式的糟糕支持&#xff0c;我不得不另外寻找一个画图工具。当然我也同样很喜欢 visio &#xff0c;但同样的&#xff0c;它对数学公式的支持糟糕&#xff0c;另外&#xff0c;最为重要的是&#xff0c;v…

java设计模式(十二)享元模式(Flyweight Pattern)

1、模式介绍&#xff1a; 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态&#xff08;可共享&#xff09;和外部状态&#xff08;不可共享&#xff09;来减少内存消耗和提高性能。内部状态存储在享元对…

​Chrome插件:React Developer Tools为React开发调试而生

React Developer Tools 是什么? 它是允许在Chrome和Firefox开发者工具中检查React组件层次结构的扩展插件。 插件源码下载 源码下载地址:GitHub - facebook/react-devtools at v3 下载完成以后执行红框中的代码,下载react-devtools 源码,源码如下图所示: 插件打包 当前n…

【软件测试】如何搭建appium工具环境?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、安装Java Development Kit&#xff08;JDK&#xff09; 前往Oracle官网下载JDK。 在https:/…

用Python制作动态钟表:实时显示时间的动画

文章目录 引言准备工作前置条件 代码实现与解析导入必要的库初始化Pygame绘制钟表函数主循环 完整代码 引言 动态钟表是一种直观且实用的UI元素&#xff0c;能够实时显示当前时间。在这篇博客中&#xff0c;我们将使用Python创建一个动态钟表&#xff0c;通过利用Pygame库来实…

高校搭建AIGC新媒体实验室,创新新闻教育教学模式

高校作为人才培养的重要阵地&#xff0c;必须紧跟时代步伐&#xff0c;不断创新教育教学模式&#xff0c;提升跨界融合育人水平&#xff0c;通过AIGC新媒体实验室探索创新人才培养模式。AIGC新媒体实验室不仅能够高效赋能高校宣传媒体矩阵&#xff0c;也可以助力教学实践与AIGC…

【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)

文章目录 定义结构Demo | 代码Subject目标类Observer抽象观察者观察者1 | CPU监听器观察者2 | 内存监听器客户端 | Client 优点适合场景 定义 所谓观察者模式就是你是被观察的那个对象&#xff0c;你爸爸妈妈就是观察者&#xff0c;一天24h盯着你&#xff0c;一旦你不听话&…

使用requests爬取拉勾网python职位数据

爬虫目的 本文是想通过爬取拉勾网Python相关岗位数据&#xff0c;简单梳理Requests和xpath的使用方法。 代码部分并没有做封装&#xff0c;数据请求也比较简单&#xff0c;所以该项目只是为了熟悉requests爬虫的基本原理&#xff0c;无法用于稳定的爬虫项目。 爬虫工具 这次…