熟练使用有棱有角的内存
内存实际上是一种名为内存IC的电子元件。虽然内存IC包括DRAM、SRAM、ROM”等多种形式,但从外部来看,其基本机制都是一样的。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址(address),来进行数据的读写。
在介绍程序时,我们会用类似于楼房的图形来表示内存。1 层可以存储 1 个字节的数据,楼层号表示的就是地址。
虽然内存的实体是内存 IC ,不过从程序员的角度来看,也可以把它假想成每层都存储着数据的楼房,并不需要过多地关注内存 IC 的电源和控制信号等。
程序员眼里的内存模型中,还包含着物理内存中不存在的概念,那就是数据类型。数据类型表示存储的是何种类型的数据。从内存来看,就是占用内存大小(占有的楼层数)的意思。即使是物理上以 1 个字节为单位来逐一读写数据的内存,在程序中,通过指定其类型(变量的数据类型),也能实现以特定字节数为单位进行读写。
理解指针的关键点就是要弄清楚数据类型这个概念。
指针也是一种变量,它所表示的不是数据的值,而是存储着数据的内存地址。
通过指针,就可以对任意指定地址的数据进行读写。
在 Windows 计算机上使用的程序通常是 32 位(4字节)的内存地址。这种情况下,指针变量的长度也是 32 位。
内存最直接的使用方式。在这里,我们要用到数组。
数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据会通过连续的编号被区分开来,这个编号称为索引。指定索引后,就可以对该索引所对应的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现的。
下图中,在 C 语言中定义 char 类型、short 类型和 long 类型这三个数组。用括号围起来的 [100] ,表示数组的元素有 100 个。由于数组的索引是从 0 开始的,因此,char g[100] 表示的就是可以使用 g[0] ~ g[99] 这 100 个元素。
栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。
需要临时保存计算过程中的数据、连接在计算机上的设备、输入输出的数据时,都可以通过栈和队列来使用内存。
栈和队列的区别在于数据出入的顺序是不同的。在对内存数据进行读写时,栈用的是 LIFO(Last Input First Out,后进先出)方式,而队列用的则是 FIFO(First Input First Out,先进先出)方式。如果我们在内存中预留了出栈和队列所需要的空间,并确定好写入和读出的顺序,就不用再指定地址和索引了。
如果要在程序中实现栈和队列,就需要以适当的元素数来定义一个用来存储数据的数组,以及对该数组进行读写的函数对。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)