内存的物理机制很简单
内存实际上是一种名为内存 IC 的电子元件。 虽然内存 IC 包括 DRAM、 SRAM、 ROMA 等多种形式, 但从外部来看, 其基本机制都是一样的。
内存 IC 中有电源、 地址信号、 数据信号、 控制信号等用于输入输出的大量引脚( IC 的引脚), 通过为其指定地址( address), 来进行数据的读写
那么, 这个内存 IC 中能存储多少数据呢? 数据信号引脚有 D0~D7共八个, 表示一次可以输入输出 8 位( = 1 字节) 的数据。 此外, 地址信号引脚有 A0~A9 共十个, 表示可以指定 0000000000~1111111111 共1024 个地址。 而地址用来表示数据的存储场所, 因此我们可以得出这个内存 IC 中可以存储 1024 个 1 字节的数据。 因为 1024 = 1KA, 所以该内存 IC 的容量就是 1KB。
容量是取决于地址引脚数目----2^10
总体来讲, 内存 IC 内部有大量可以存储 8 位数据的地方, 通过地址指定这些场所,之后即可进行数据的读写
内存的逻辑模型是楼房
在介绍程序时, 会用类似于楼房的图形来表示内存。 在这个楼房中, 1 层可以存储 1 个字节的数据, 楼层号表示的就是地址。
虽然内存的实体是内存 IC, 不过从程序员的角度来看, 也可以把它假想成每层都存储着数据的楼房, 并不需要过多地关注内存 IC 的电源和控制信号等。 因此, 之后的讲解中我们也同样会使用楼房图( 或者与楼房相似的图)。 内存为 1KB 时, 表示的是有 1024层的楼房( 这里地址的值是从上往下逐渐变大, 不过也有与此相反的情况)。
编程语言中的数据类型表示存储的是何种类型的数据。 从内存来看, 就是占用的内存大小( 占有的楼层数) 的意思。 即使是物理上以 1 个字节为单位来逐一读写数据的内存, 在程序中, 通过指定其类型( 变量的数据类型等), 也能实现以特定字节数为单位来进行读写
比如在C语言中,char类型是一个字节(那就是一个楼层),int是4个字节(那么就是连续的4个楼层)
问题:假如程序中只能逐个字节地对内存进行读写, 那该多么不便啊
此时就引出来了指针对内存的操作,一次性操作多个字节的数
指针:也是一种变量, 它所表示的不是数据的值, 而是存储着数据的内存的地址。 通过使用指针, 就可以对任意指定地址的数据进行读写
这些数据类型表示的是从指针存储的地址中一次能够读写的数据字节数
数组是高效使用内存的基础
数组是指多个同样数据类型的数据在内存中连续排列的形式。 作为数组元素的各个数据会通过连续的编号被区分开来, 这个编号称为索引( index)。 指定索引后, 就可以对该索引所对应地址的内存进行读写操作 A。 而索引和内存地址的变换工作则是由编译器自动实现的
数组的定义中所指定的数据类型, 也表示一次能够读写的内存大小。 char 类型的数组以 1 个字节为单位对内存进行读写, 而 short 类型和 long 类型的数组则分别以 2 个字节、 4 个字节为单位对内存进行读写。 数组是使用内存的基本。
之所以说数组是内存的使用方法的基础, 是因为数组和内存的物理构造是一样的。 特别是 1 字节类型的数组, 它和内存的物理构造完全一致。 不过, 如果只能逐个字节地来读写, 程序就会变得比较麻烦,因而可以指定任意数据类型来定义数组。 这和将 1 层 = 1 单元的楼房改造成多个楼层 = 1 单元的楼房是同一个道理