一、内存的读写过程
内存IC进行数据写入和读取的模型:
假设我们要向内存IC中写入1byte的数据的话,它的过程是这样的:
● 首先给VCC接通 +5V的电源,给GND接通 0V的电源,使用A0-A9来指定数据存储场所,然后再把数据的值输入给D0-D7的数据信号,并把WR(write)的值置为1,执行完这些操作后,既可以向内存IC写数据
● 读出数据时,只需要通过A0-A9地址信号指定数据的存储场所,然后再将RD的值置为1即可
● 图中的RD和WR又被称为控制信号,其中当WR和RD都为0时,无法进行写入和读取操作
二、内存的现实模型
为了便于记忆,可以把内存模型映射成为我们现实世界的模型,在现实世界中,内存的模型很像我们生活的楼房,在这个楼房中,1层可以存储一个字节的数据,楼层号就是地址,下面式内存和楼层整合的模型图:
1KB内存模型图:
程序中的数据不仅仅只有数值,还有数据类型的概念,从内存上来看,就是占用内存大小(占用楼层数)的意思,即使物理上强制以1个字节为单位来逐一读写数据的内存,在程序中,通过指定数据类型,也能实现下面式一个以特定字节数为例来读写指令字节的程序的示例:
//定义变量 char a; char b; char c; //变量赋值 a=123; b=123; c=123;
通过分别声明了三个变量abc,并给每个变量赋上相同的123,这三个变量表示内存的特定区域。通过变量,即使不指定物理地址,也可以直接完成读写操作,操作系统会自动为变量分配内存地址。
这三个变量分别表示1个字节长度的char,2个字节长度的short,表示4个字节的long,因此,虽然数据都表示的是123,但是其存储时所占的内存大小是不一样的。如下所示:
变量存储示意图:
这里的123都没有超过每个类型的最大长度,所以short和long类型为多占用的其他内存空间分配的数值是0,这里我们采用的是低字节序列的方式存储
低字节序列:将数据低位存储在内存低位地址
高字节序列:将数据的高位存储在内存低位的方式称为高字节序列
三、指针
指针是C语言非常重要的特征,指针也是一种变量,只不过它所表示的不是数据的值,而是内存的地址。通过使用指针,可以对任意内存地址的数据进行读写
在了解指针读写的过程前,我们需要了解如何定义一个指针,和普通的变量不同,在定义指针时,我们通常会在变量名前加一个 * 号,例如我们可以在指针定义如下的变量:
char *d;//char类型的指针d定义 short *e;//short类型的指针e定义 long *f;//long类型的指针f定义
以32位计算机为例,32位计算机的内存地址是4字节,在这种情况下,指针的长度也是32位,然而,变量def却代表了不同字节长度。
实际上,这些数据表示的是从内存中一次读取的字节数,比如def的值都为100,那么使用char类型时就能够从内存中读写1byte的数据,使用short类型就能够从内存读写2字节的数据,使用long就能够读写4字节的数据,下面式一个完整的类型字节表:
类型 | 32位 | 64位 |
char | 1 | 1 |
short int | 2 | 2 |
int | 4 | 4 |
unsigned int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
long | 4 | 8 |
long long | 8 | 8 |
unsigned long | 4 | 8 |