C语言深处

    返回首页    发表留言
本文作者:李德强
          第一节 内存地址
 
 

        注:本教程采用系统环境为32位小尾机,所使用的编译器为gcc 5.1.1,在编译时采用C99标准(为gcc加入-std=c99编译选项),以后章节中不再作特殊说明。

 

        学过C语言的人都知道一句话——指针是C语言的灵魂。因为指针可以直接操作内存,通过对内存的访问直接修改内存中数据的内容从而可以极高性能、极其灵活的实现相应的功能。所以在本教程中的第一节,我们首先就要学习内存的结构,明白它到底是什么样的,程序是如何来把自己需要的数据存入内存当中的。

        从市场上买电脑时人们总说电脑的内存是2G、4G、8G或者是16G的。这些数量单位是如何计算的呢?首先要明白的是现代电子计算机都是二进制计算机,也就是说对于计算机而言所有的数据不是0就是1。从电子物理学上说就是低电压和高电压,但这在计算机领域中我们只称为0和1。如果我们有8个连续的格子,它们的编号从右到左分别为0、1、2、3、4、5、6、7,它们中所存放的数据分别为1、1、0、1、0、1、0、0,效果如下,虚线中的是格子的标号,实线中的是其存放的数据0或1:

        这8个格子中的数据可以为任意的0或1的组合,即:00000000、00000001、00000010、00000011、00000100 …… 11111111。也就是说这8个格子的数据可以有256个0、1的组合方案,一共可以表示256个整数0 ~ 255。在计算机内存中每一个格子被称为是一个bit位,而每8个连续bit位被称为是一个byte,也就是一个字节,byte字节是内存的最小单元。对于二进制与十进制换算的方法非常简单,即每一个bit位所在标号的值就是2的几次方,如上图中数值二进制表示为00101011,它的5、3、1、0bit位上是1,其它bit位上是零,所以计算方法如下:

        其外还有KB、MB、GB、TB单位,它们的换算比例均为也就是1024,如下:

  • 1KB = 1024B
  • 1MB = 1024KB
  • 1GB = 1024MB
  • 1TB = 1024GB

        内存最小的数据存储单元就是byte,如果有一个4KB大小的内存,就说是有4096个最小存储单元,也就是有4096个byte,每一个byte中都有8个bit位,标号从0到7。那么内存的结构图如下:


 

        内存中的每个byte都有一个唯一的地址编号0x0001、0x0002、0x0003 …… 一直到最大的内存地址0x1000(这里的编号习惯上采用16进制表示,如果使用10进制表示也是没有问题的即:0、1、2、3、4、5 …… 4096),这些内存编号被称作内存地址。内存地址是一个非常重要的概念,对内存所有的读写操作都要使用它。对于更大的内存比如4G、8G和16G内存而言,只不过是容量比1K的内存大了而已,其原理都是一样的。

    返回首页    返回顶部
#1楼  leifengV5  于 2018年01月10日17:15:44 发表
 
文章中有错误1KB内存最大内存地址的16进制应该是0x400吧?图片和文章最后一段都写错了吧
#2楼  李德强  于 2018年01月10日20:06:52 发表
 
非常感谢您的指正!此处内容已修正。
  看不清?点击刷新

 

  Copyright © 2015-2018 问渠网 辽ICP备15013245号