计算机内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号称为内存地址,通常也把内存地址称为指针。
一般情况下,在C语言程序中只需指出变量名,不需要知道变量在内存中的具体地址,每个变量与具体地址之间的联系由编译程序去完成。
可以用一个通俗的例子来说明它们之间的关系:到银行去存、取款时,银行工作人员将根据账号去找存款单,找到之后在存款单上写入存款、取款的金额。在这里,账号就是存单的指针,存款数是存单的内容。
1.变量地址
变量地址就是系统分配给变量的内存单元的起始地址。
假设有这样一个程序:
C语言编译程序编译到该变量定义语句时,将变量num登录到“符号表”中,符号表的关键属性有两个:一是“标识符名(id)”,二是该标识符在内存空间中的“地址(addr)”。
为描述方便,假设系统分配给变量num的两个字节存储单元为3000和3001,则起始地址3000就是变量num在内存中的地址。
2.变量值的存取
系统执行“scanf("%d",&num);”和“printf("num=%d\n",num);”时,存取变量num值的方式可以有如下两种。
(1)直接访问。
程序中对变量进行存取操作,实质是对某个地址的存储单元进行操作。
这种直接利用变量的地址进行存取的方式,称为直接访问方式。
①“scanf("%d",&num);”的执行过程是这样的。
用变量名num作为索引值,检索符号表,找到变量num的起始地址3000;然后将键盘输入的值(假设为60)送到内存单元3000和3001中。(www.xing528.com)
②“printf("num=%d\n",num);”的执行过程与scanf()很相似,具体如下:
首先找到变量num的起始地址3000,然后从3000到3001中取出其值,最后将它输出。如图6-1所示。
图6-1 变量与地址关系
(2)间接访问。
通常,把间接通过另一变量地址存取该变量的值的方法,称为间接访问方式。
在C语言程序中,可以定义一种特殊的变量(称为指针变量)来存放其他变量的地址。
假如定义了这样一个指针变量num_pointer,它被分配到4000、4001单元,其值可通过赋值语句“num_pointer=#”得到。此时,指针变量num_pointer的值就是变量num在内存中的起始地址3000。如图6-2所示。
图6-2 指针变量与变量关系
变量num_pointer存取变量num值的过程如下:
首先找到指针变量num_pointer的地址4000,取出其值3000(正好是变量num的起始地址);然后从3000、3001中取出变量num的值60。
说明:
直接访问和间接访问之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。
一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。
另一种情况是,甲不知道乙在何处,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。