计算机的内存看作是一排很长很长的房子,每个房子都可以放数据,通过一个房号来标识。
这个比喻颇为有用,也存在局阻性。计算机的内存由数以亿万计的位(bit)组成,每个位可以容纳值0或1.由于一个位所能表示的值的范出太有限,所单独的位用处不大,通常许多位合成一组作为一个单位(比如最小8位,char类型),这样就可以存储范围较大的值。画个图来描述机器中的内存位置。
![](https://zouzhongliang.com/wp-content/uploads/2019/05/内存.jpg)
这些位置的每一个都被称为字节Byte,每个字节都包含了存储一个字符所需要的位数,很多机器上,每个字节包含8个位(可存2的8次方)。可以存储无符号值0至255,或有符号值一128至127。上图并没显示这些位置的内容,但内存中的每个位置总是包含一些值。每个字节通过地址来标识,如上方框上面的数字所示。
为了存储更大的值,我们把两个或更多个字节合在一起作为一个更大的内存单位,这样就会有short,int,long。这样能表示的数就有2的16、32、64次方。
注意一点更大的内存单位,它也只有一个地址。至于它的地址是它最左边那个字节的位置还是最右边那个字节的位置,不同的机器有不同的规定。这点不是程序员要担心的,编译器会处理好与硬体之间的事情。
![](https://zouzhongliang.com/wp-content/uploads/2019/05/地址.jpg)
另一个需要注意的硬件边界对齐(boundary alignment)。在要求边对齐的机器上,整型存的起始位置只能是某些特定的字节通常是2或4的倍数。但这些问题是硬件设计者的事情,它们很少影响c程序员,我们只对两 件事情感兴趣:
1.内存中的每个位置由一个独一无二的地址标识
2.内存中的每个位置都包含一个值。
地址与内容
上面哪个图,这次让它显示了内存中5个的内容:
![](https://zouzhongliang.com/wp-content/uploads/2019/05/内存-1.jpg)
这里显示的5个值,知道它对应的地址后,就可以通过地址来取得这个值。但是,要记住所有的地址方法不好,所以后来有了高级语言。一般高级语言提供的特性之一就是通过名字面不是地址来访问内存的位置。下面再画张图用名字代替地址。
![](https://zouzhongliang.com/wp-content/uploads/2019/05/内存-2.jpg)
当然,这些名字就是我们编程时所称的变量。例:int? A = 0;? ?//变量A
注:有一点非常重要,必须记住,名字与内存位置之间的 关联并不是硬件所提供的,它是由编译器为我们实现的,所有这些变量给了我们一种更方便的方法记住地址——–硬件仍然通过地址访问内存位置。