嵌入式学习----数据结构

一.1.什么是数据结构
 一组用来保存一种或者多种特定关系的数据的集合(组织和存储数据)

程序 = 数据结构 + 算法

程序的设计:将现实中大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中,并在此基础上实现某个特定的功能的操作;

2.数据与数据之间的关系
(1)数据的逻辑结构:数据元素与元素之间的关系

线性结构:元素之间一对一的关系(表(数组,链表),队列。栈。。。)

树型结构:元素之间一对多的关系(二叉树)

 图形结构:元素之间多对多的关系(网状结构)城市轨道交通,有当前数据可以找到多个后继

(2)数据的物理结构:数据的逻辑结构在计算机内存中的存储形式
①顺序存储:采用一段连续的内存空间保存元素(数组)

优点:空间连续,访问方便

缺点:插入删除需要移动大量的元素 | 需要预分配内存空间 | 容易造成存储空间碎片

②链式存储:采用一组非连续的内存空间保存元素(链表)

缺点:访问元素效率低

优点:插入和删除数据方便 | 不需要预分配内存

③索引存储:通过关键字构建索引表,通过索引表来来找到数据的存储位置 提高数据的存储效率 将存储位置与关键字存储在索引表

④散列存储(哈希存储):将数据元素的存储位置与关键码之间建立确定对应关系从而实现查找的存储方式 哈希函数或散列函数

3.数组和链表的区别:
数组:空间连续,数据访问方便,数据插入和删除不方便 ,需要预分配内存空间

链表:内存不连续,数据访问不方便,数据的插入和删除效率高,不需要预分配内存空间

4.什么是内存碎片
采用分区式存储管理的系统,在储存分配过程中产生的、不能供用户作业使用的主存里的小分区称成“内存碎片”。内存碎片分为内部碎片和外部碎片

①内部碎片就是已经被分配出去(能明确指出属于哪个进程)却不能被利用的内存空间;

(例如结构体里面存在多种数据结构,又因为结构体对齐原则引发了内部内存碎片,解决办法是使用函数认为规定一个对齐的准则以减少内部内存碎片)

内部碎片是处于区域内部或页面内部的存储块。占有这些区域或页面的进程并不使用这个存储块。而在进程占有这块存储块时,系统无法利用它。直到进程释放它,或进程结束时,系统才有可能利用这个存储块。单道连续分配只有内部碎片。多道固定连续分配既有内部碎片,又有外部碎片。

②外部碎片指的是还没有被分配出去(不属于任何进程),但由于太小了无法分配给申请内存空间的新进程的内存空闲区域。

外部碎片是出于任何已分配区域或页面外部的空闲存储块。这些存储块的总和可以满足当前申请的长度要求,但是由于它们的地址不连续或其他原因,使得系统无法满足当前申请。

二.指针,数组,数组指针,指针数组的区别:
1. 指针(Pointer)
指针是一个变量,它存储的是另一个变量的内存地址,而不是数据本身。通过指针,我们可以直接访问和操作内存中的数据。指针的声明通常使用星号(*)前缀,如 int *ptr; 表示 ptr 是一个指向整数的指针。

2. 数组(Array)
数组是一系列相同类型的数据项的集合,这些数据项在内存中连续存储。数组通过索引来访问其元素,索引从0开始。数组的声明方式如 int arr[10]; 表示 arr 是一个包含10个整数的数组。

3. 数组指针(Pointer to an Array)
数组指针是指向整个数组的指针。这意味着,它存储的是数组首元素的地址,但与普通指针不同的是,通过它可以知道数组的大小(如果指针类型明确指定了数组的长度)。然而,在C语言中,直接声明一个“指向数组的指针”的语法并不直接支持指定数组的长度,但可以通过指针的运算或类型定义来间接实现。通常我们说的数组指针是指向数组第一个元素的指针,如 int (*ptr)[10]; 声明了一个指向包含10个整数的数组的指针。

4. 指针数组(Array of Pointers)
指针数组是数组的每个元素都是指针的数组。这些指针可以指向相同类型的数据,也可以指向不同类型的数据(但在大多数情况下,为了类型安全,它们会指向相同类型的数据)。指针数组的声明方式如 int *ptrArray[5]; 表示 ptrArray 是一个包含5个指向整数的指针的数组。

区别总结:
指针:存储的是变量的内存地址,用于直接访问和操作内存中的数据。
数组:一系列相同类型的数据项的集合,通过索引访问。
数组指针:指向整个数组的指针,但C语言标准中不直接支持指定长度的数组指针,通常指向数组首元素的指针。
指针数组:数组的每个元素都是指针,这些指针可以指向相同或不同类型的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值