数据结构(一)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.mzph.cn/pingmian/40591.shtml

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

相关文章

面试篇-Redis-2+持久化+过期key删除+内存淘汰

文章目录 前言一、你知道Redis 数据是怎么持久化的1.1 Redis 持久化的方式Rdb:1.1.1 主动备份save 命令:1.1.2 Redis 中使用bgsave 进行Rdb 的持久化 : 1.2 Redis 持久化的方式Aof:1.2.1 使用AOF 模式进行数据存储:1.2…

明星代言方式8种助力品牌占领市场-华媒舍

1. 明星代言的重要性和市场价值 明星代言是一种常见的品牌推广方式,通过联系知名度高的明星来推广产品或服务,从而提升品牌的知名度和美誉度。明星代言能够借助明星的影响力和粉丝基础,将品牌信息传达给更广泛的受众,从而提高销量…

Web Based Quiz System v1.0 SQL 注入漏洞(CVE-2022-32991)

前言 CVE-2022-32991 是一个影响 Web Based Quiz System v1.0 的 SQL 注入漏洞。这个漏洞存在于 welcome.php 文件中的 eid 参数处。攻击者可以通过此漏洞在数据库中执行任意 SQL 语句,从而获取、修改或删除数据库中的数据。 具体细节如下: 攻击向量&…

Es结合springboot(笔记回忆)

导包 <!--导入es--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency><groupId>org.springframework.boot<…

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

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

软信天成:您的数据仓库真的“达标”了吗?

在复杂多变的数据环境中&#xff0c;您的数据仓库是否真的“达标”了&#xff1f;本文将深入探讨数据仓库的定义、合格标准及其与数据库的区别&#xff0c;帮助您全面审视并优化您的数据仓库。 一、什么是数据仓库&#xff1f; 数据仓库是一个面向主题的、集成的、相对稳定的、…

一个R包完成单细胞基因集富集分析 (全代码)

singleseqgset是用于单细胞RNA-seq数据的基因集富集分析的软件包。它使用简单的基础统计量&#xff08;variance inflated Wilcoxon秩和检验&#xff09;来确定不同cluster中感兴趣的基因集的富集。 Installation library(devtools) install_github("arc85/singleseqgse…

iOS手机竖着拍的照片被旋转了90°的原因以及解决方案

EXIF.getData(IMG_FILE, function () { // IMG_FILE为图像数据 var orientation EXIF.getTag(this, “Orientation”); console.log(“Orientation:” orientation); // 拍照方向 }); 获取拍照方向的结果为1-8的数字&#xff1a; 注意&#xff1a;对于上面的八种方向中&a…

2024.7.4作业

1.梳理笔记(原创) 2. 终端输入一个日期&#xff0c;判断是这一年的第几天 scanf("%d-%d-%d",&y,&m,&d); 闰年2月29天&#xff0c;平年2月28天 #include <stdio.h> int main(int argc,const char *argv[]) { int y0,m0,d0,sum0,i0; …

数据库表导出到excel:前置知识1 ALL_TAB_COLS

ALL_TAB_COLS 当前用户可访问的表、视图和群集的列的相关信息 其中几个字段: OWNER&#xff1a;表&#xff0c;视图及群集的Owner   TABLE_NAME&#xff1a; 表&#xff0c;视图及聚簇的名称   COLUMN_NAME&#xff1a; 字段名   DATA_TYPE &#xff1a;字段的数据类型…

万字长文MySQL Binlog 详细指南

目录 第一阶段 MySQL Binlog 基础用法1. Binlog基本概念1.1 什么是Binlog1.2 Binlog的作用1.3 Binlog格式 2. 配置和管理Binlog2.1 开启Binlog2.2 设置Binlog文件大小和保留时间2.3 查看Binlog状态 3. Binlog的实际应用3.1 数据恢复3.2 主从复制3.3 审计 4. Binlog工具使用4.1 …

收银系统源码-收银台营销功能-购物卡

1. 功能描述 购物卡&#xff1a;基于会员的电子购物卡&#xff0c;支持设置时效、适用门店、以及可用商品&#xff1b;支持售卖和充值赠送&#xff0c;在收银台可以使用&#xff1b; 2.适用场景 会员充值赠送活动&#xff0c;例如会员充值1000元&#xff0c;赠送面值100元购…

145-四路16位125Msps AD FMC子卡模块

一、概述 该板卡可实现4路16bit 125Msps AD 功能&#xff0c;是xilinx开发板设计的标准板卡。FMC连接器是一种高速多pin的互连器件&#xff0c;广泛应用于板卡对接的设备中&#xff0c;特别是在xilinx公司的所有开发板中都使用。该AD&#xff0c;DA子卡模块就专门针对xilinx开发…

羊大师:羊奶养生,解锁健康之道的新密码

在探寻健康与养生的旅途中&#xff0c;我们总渴望找到那把开启健康之门的钥匙。而今&#xff0c;羊奶以其独特的营养价值和健康益处&#xff0c;正悄然成为那把解锁健康之道的新密码。 羊奶&#xff0c;自古以来便是自然赋予的珍贵礼物。它富含优质蛋白、多种维生素及矿物质&am…

nginx的重定向(rewrite)

1、location 匹配 location匹配的就是后面的URL&#xff0c;对访问的路径做访问控制或者代理转发 共有三个匹配&#xff1a;精确匹配、正则匹配、一般配 a、精确匹配 格式&#xff1a;location/ 对字符串进行完全匹配&#xff0c;必须完全合 c、正则匹配 ^~&#xff1a;前…

Android 抓取 CPU 资源信息

在 Android 开发中&#xff0c;使用 ADB&#xff08;Android Debug Bridge&#xff09;命令获取 CPU 资源信息有很多重要的作用。这些命令可以帮助开发者在多种情况下分析和优化应用性能、解决问题以及进行系统性调试。 以下列举一些 ABD 获取 CPU 资源信息的命令 获取 CPU 核…

Docker镜像加速配置

由于当前运营商网络问题&#xff0c;可能会导致您拉取 Docker Hub 镜像变慢&#xff0c;索引可以配置阿里云镜像加速器。阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 每个人镜像地址都不一样&#xff0c;需要登陆阿里云自行查看&#xff0c;地址在上面&a…

SSM学生资助管理系统-计算机毕业设计源码30825

目 录 摘 要 1 绪论 1.1 研究背景 1.2研究意义 1.3论文结构与章节安排 2 学生资助管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分析 2.4 …

Conmi的正确答案——ESP32-C3开启安全下载模式

IDF版本&#xff1a;4.4.7 注意事项&#xff1a;一旦烧录“安全下载模式”&#xff0c;模组将无法被读取或清理&#xff0c;只能通过eclipse原项目烧录程序进行重新烧录&#xff0c;无法再烧录其他固件。 20240703110201——追加解法&#xff0c;暂时无法解安全下载模式 &…

拓展欧几里得和裴蜀定理

裴蜀定理&#xff08;或贝祖定理&#xff09;说明了对任何整数a、b和它们的最大公约数d&#xff0c;关于未知数x和y的线性不定方程&#xff08;称为裴蜀等式&#xff09;&#xff1a;若a,b是整数,且gcd(a,b)d&#xff0c;那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…