先来看一个比喻,这个比喻颇为有用,但也存在局限性。
我们可以把内存看为一条长街上的一排房屋,每座房屋都可以容纳数据,并通过一个房号标识。
计算机的内存由数以万计的位(bit)组成,每个位可以容纳值0和1。由于一个位所能表示的值的范围太有限,所以单独的位用处不大,通常许多位合成一组作为一个单位,这样就可以存储范围较大的值。
图例展示了现实机器中的一些内存位置:
这些位置的每一个都被称为字节(byte),每个字节都包含了存储一个字符所需的位数。
在现代机器上每个字节(byte)包含8个位,可以存储无符号数0至255或有符号值-128至127。图例中并没有显示这些位置的内容,但内存中每个位置总是包含一些值。每个字节通过地址来标识,如图示中方框上面的数字。
为了存储更大的值,我们把两个或更多字节组合在一起作为一个更大的内存单位。例如,许多机器以“字”为单位存储整数,每个字一般由2个或者4个字节组成。由于它们包含更多的位,每个字将容纳的数值范围将会更大。
注意!
- 尽管一个字包含了更多的字节,但它仍然只有一个地址。至于它的地址是最左边那个字节的位置还是最右边那个字节的位置,不同机器有着不同规定。
- 另一个是边界对齐(boundary allignment)在要求边界对齐的机器上,整型存储的起始位置,只能是某些特定的字节,通常是2和4的倍数。
值得C程序员注意的两点:
- 内存中每个位置由一个独一无二的地址标识;
- 内存中每个位置都包含一个值;
地址与内容
图示:图中显示内存中5个字的内容,每个都位于自己的字中,如果记住了一个值的地址那么以后就可以根据地址取得该值。
但是,要记住这些地址实在是很笨拙的办法,所以高级语言所提供的特性之一就是通过名字而不是地址来访问内存的位置。
有一点非常重要,需牢记,名字与内存位置之间的关联并不是硬件所提供的,它是由编译器来实现的。
所有这些变量给我们一种更方便的方法记住地址—硬件仍然通过地址访问内存位置。
END!