9.1.2 地址的概念

传统生活中,表示一个地址时,可以用文字描述:

“XX市XX区XX路XX号”

可以看到,这是一堆人类能看懂的文字,这个文字代表一个真实地址,也就是说,如果真的按照这个文字去找,能找到一个实际的地理位置。

计算机中的地址是什么意思呢?其实跟人类社会中的地址很类似,人类社会中是用一堆文字来描述一个地址,而计算机中使用一个数字来描述一个地址,如1000,这是数字(十进制数),这就代表一个地址,只不过计算机更习惯用十六进制的数字形式来表示一个地址(这和人类不一样,人类更习惯看十进制数字),如1000的十六进制是0x3E8(十六进制数以0x开头)。在计算机中,如果看一个地址数字,计算机往往显示出来的是0x3E8,而不会显示成1000,但在讲解时,笔者还是会用1000这样的十进制数字来表示一个地址,因为这样方便人类观看或阅读。这个1000就表示一个真实的计算机地址,只要到内存中找这个1000所代表的地址,就真的能够找到。

简而言之,地址在计算机中就是一个数字,代表一个内存位置。

计算机内存中的地址不是杂乱无章,而是有编号的,如图9.1所示(这只是一个示意图,辅助读者理解)。可以注意到,这个内存地址也是从上到下,从小到大,挨着排列的,每个数字对应一个地址,也就是图中所示的格子。

现在定义了两个整型变量i和j,i给初值5,j给初值6,因为每个变量占4字节内存,假设系统把上面这段内存分配给了这两个整型变量,看一看分配完之后内存的样子,如图9.2所示。

图9.1 内存中的地址编号

图9.2 变量i和j的值在内存中的保存情形

注意到,地址1000~1003分配给了变量i,地址1004~1007分配给了变量j。

可以看到,内存只有“地址”和“地址中保存的内容”这两个概念,内存本身并不知道i和j这样的名字代表的是什么含义,但在程序内部会维持一张表,这张表会记录变量名和变量地址(内存地址)的对应关系,这样,在编写代码的时候,在源代码中写i,系统就能找到该变量名对应的内存地址以及该内存地址中的内容。例如针对语句printf("i+j=%d",i+j);,系统会如何去执行呢?系统从维持的这张表中找到i的地址1000,因为i是整型,所以系统取出从1000开始的4字节(1000~1003每个地址保存1字节)内容作为i的值,再找到j的地址1004,因为j也是整型,所以系统取出从1004开始的4字节(1004~1007)内容作为j的值,然后做两者的加法运算并输出结果。