一、概念认知
先说一个概念:数组是一段连续的内存空间。存储相同的数据类型。
数组的两个关键点:
- 连续内存;
- 相同类型。
第一个特征:起点。
首先连续内存:所以为了找到动态数组我们必须找到一个首元素地址。(内存首地址。)
如果不知道首地址,那无法找到并操作内存空间。
第二个特征:容量。
知道首地址了,我们需要知道元素的个数。动态数组:动态,可以动态插入、删除、扩展容量。所以我们必须有个初始容量。开辟多大空间,放多少个元素。除了容量,最好还有一个状态量:表示当前的数据量:也就是说长度。
- 容量说的是:可以放多少数据。
- 长度说的是:当前有多少数据。
我的钱包(=银行)(容量)无限大,而我当前拥有的钱有限(长度)。
第三个特征:类型。
我们虽然有了首地址,也有了元素个数,但是我们还是不知道开辟多大空间。因为我们还需要元素的大小。元素所占内存的大小,其实就是元素的类型。可是:
C语言无法动态获取数据的类型。
好在我们还有void*类型可以指向任意类型的指针。
所以我们虽然不知道具体元素的类型,但是我们可以定义一个通用的指针类型,指向我们的元素的地址即可。所以我们的元素就是地址。
所以我们的元素类型就是void*。所以我们的数组指针就是void**类型。
二、实现
动态数组其实就是一种结构体。 一种自定义类型。
2.1定义数据结构。
先写数据信息结构。
首地址,就像存储字符串数组一样。
char * arr[] = {"aaa", "bbb", "ccc"};
arr数组中每个元素都是char*类型,那么arr如果写入结构体中,可以定义为:
struct DemoStruct
{
char ** arr;
int b;
}
同样道理:元素类型为void*。那么定义数组则为void** arr;
//1. 先把所需要的数据信息结构定义下来
struct DynamicArray
{
//数组存储元素的空间的首地址
void **addr;
//存储数据的内存中最大能够容纳多少元素
int capacity; //容量
//当前存储数据的内存中有多少个元素
int size

文章介绍了如何在C语言中实现动态数组,包括定义数据结构、初始化、插入元素、遍历、删除和销毁等操作。动态数组使用结构体封装,包含首地址、容量和大小等属性,并通过void*类型处理不同数据类型。文章还讨论了类型安全性和面向对象的封装改进。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



