首页 理论教育 C语言程序设计教程-内存地址及变量访问

C语言程序设计教程-内存地址及变量访问

时间:2023-10-27 理论教育 版权反馈
【摘要】:内存单元的地址与内存单元中的数据是两个完全不同的概念。为描述方便,假设系统分配给变量num的两个字节存储单元为3000和3001,则起始地址3000就是变量num在内存中的地址。图6-1变量与地址关系间接访问。图6-2指针变量与变量关系变量num_pointer存取变量num值的过程如下:首先找到指针变量num_pointer的地址4000,取出其值3000;然后从3000、3001中取出变量num的值60。

C语言程序设计教程-内存地址及变量访问

计算机内存是以字节为单位的一片连续的存储空间,每一个字节都有一个编号,这个编号称为内存地址,通常也把内存地址称为指针

一般情况下,在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。

说明:

直接访问和间接访问之间的关系,可以用某人甲(系统)要找某人乙(变量)来类比。

一种情况是,甲知道乙在何处,直接去找就是(即直接访问)。

另一种情况是,甲不知道乙在何处,但丙(指针变量)知道,此时甲可以这么做:先找丙,从丙处获得乙的去向,然后再找乙(即间接访问)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈