学习golang(6) 初探:用c语言实现一个动态数组

简介: 学习golang(6) 初探:用c语言实现一个动态数组

我尝试使用go来写一个动态数组,但是很可惜,我实力尚弱,尝试数次,最终以失败了,所以,决定使用c来实现一个简单的int类型的动态数组,名字也不想改变了,还是叫 学习golang 初探 吧。


所谓的动态数组,其实在本质上,和go slice相似,也是申请了一块数组,当数组不够的时候,重新申请数组,然后将老数组的数据拷贝进新数组中,再把老数组给销毁掉就好了。




动态数组逻辑


有效长度和总长度


我们还是和go slice类似,我们使用len来获取动态数组的有效数据长度,使用cap来获取底层数据的长度。


例如,在下列数组中,我们定义绿色为可以使用的数据块,黄色为不可使用的数据块。


那在数组中,cap应当为10,len有效数据长度应当为6。

image.png



如何新增有效数据

我们也可以定义一个append函数,来扩展一个有效数据,其实就是在 (len+1) < cap 的情况下,进行len+1 即可

image.png


数组如何扩容


lencap相当时,恰恰又要进行append,此时,我们就需要扩容了,我们可以按当前量扩充到2倍足以。


例如:

当前数组已经使用完了

image.png


若我们还想在增加一个,则就需要扩容才行

我们就先申请数组b,然后将老数据拷贝至数组b,cap同步修改,然后再进行扩容,不就可以了么

image.png

我们先进行扩容,然后再append



代码以及逻辑实现


初始化


结构体定义

我们将结构体定义为这样

image.png

我们结构体定义为如下

image.png


在初始化时,我们需要传入初始化一个数值作为默认大小,然后实际分配内存空间,且将容量个数传给该动态数组

image.png


追加函数


接着,我们来编写追加函数,追加函数


追加函数分为2中情况


  • 容量未满
  • 容量已经满了

对于容量未满的情况,我们直接赋值,且使有效长度+1即可

对于容量已满的情况,我们则需要做如下操作

  • 申请新动态数组,容量为老数组的2倍
  • 拷贝老数组内存
  • 重新插入数据

我们来看看append函数


image.png



测试数据

我们在main中追加一下数据,用于测试

image.png


执行c程序

我们来尝试下

image.png


我们可以看到,第一次扩容之前,起始地址为: 0x7fffed75a2b0

第一次扩容为0x7fffed75a2d0


第二次扩容为: 0x7fffed75a2f0


容量值也从3到6再到12,下一次扩容,应当为24




总结


之前之所以不用go写,我是不知道怎么定义固定数组,若不定义固定数组,像c这样定义指针的话,我又不知道如何进行动态内存分配,哎,还是对go不怎么熟悉,所以最后,尝试了若干次过后,我决定用c来写该操作,很久没有写c了,感觉还是蛮吃力的。不过好好,而恰恰好,我们go slice的基本逻辑应该和此类似,实现的代码,我还是放在Gitee上了哈 pdudo/autoArray.c


加油咯,运维小学生。




相关文章
|
1月前
|
存储 编译器 C语言
初识C语言——详细入门(系统性学习day4)
初识C语言——详细入门(系统性学习day4)
|
1月前
|
编译器 程序员 开发工具
c语言从入门到实战——在系统学习C语言之前所需要了解的知识
C语言是一种通用的、过程式的计算机编程语言,支持结构化编程、词汇变量作用域和递归等功能,其设计提供了低级别的存取权限,并且要求程序员管理所有的内存细节。C语言的基本构成包括数据类型(如整型、浮点型、字符型等)、运算符(如算术运算符、关系运算符、逻辑运算符等)、控制结构(如顺序结构、选择结构、循环结构等)以及函数等。此外,C语言还提供了指针的概念,这是其他许多编程语言所不具备的。指针是一个变量,其值为另一个变量的地址,通过指针可以间接访问和操作内存中的数据。C语言也支持数组、结构体、联合体等复合数据类型,以及文件操作、动态内存分配等高级功能。
51 0
|
1月前
|
存储 C语言
通俗易懂的学习C语言中输入一组数并找出其最大值
通俗易懂的学习C语言中输入一组数并找出其最大值
|
1月前
|
SQL 前端开发 Go
编程笔记 GOLANG基础 001 为什么要学习Go语言
编程笔记 GOLANG基础 001 为什么要学习Go语言
|
1月前
|
机器学习/深度学习 人工智能 Java
学习Python语言好还是C语言好
学习Python语言好还是C语言好
21 0
|
1月前
|
C语言
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
###51单片机学习-----如何通过C语言运用延时函数设计LED流水灯
72 0
|
1月前
|
C语言
二次学习C语言补缺(day1)
二次学习C语言补缺(day1)
17 2
|
2月前
|
编译器 C语言
C语言指针学习
C语言指针学习
17 0
|
2月前
|
存储 编译器 程序员
C语言学习大纲
C语言学习大纲
|
2月前
|
机器学习/深度学习 算法 C语言
C语言学习——打印各种图形
C语言学习——打印各种图形
54 0
C语言学习——打印各种图形