理论教育 C语言程序设计:理解指针

C语言程序设计:理解指针

时间:2023-10-20 理论教育 版权反馈
【摘要】:一般把存储器中的一个字节称为一个内存单元,不同的数据类型的变量所占用的内存单元数不等。内存单元的地址与内存单元中的数据是两个完全不同的概念。图7-1内存分配的存储单元凡在程序中定义的变量,当程序编译时,系统都会给它们分配相应的存储单元。这种通过变量名或地址访问一个变量值的方式称为“直接访问”。

C语言程序设计:理解指针

1.计算机中的内存

计算机硬件系统的内存储器中拥有大量的存储单元,当需要执行磁盘上的某一可执行程序时,操作系统负责将它调入内存。具体地说,内存中存放了程序中的语句、函数、常量、变量等。不同的语句、函数、常量、变量在内存中的位置是不同的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型的变量所占用的内存单元数不等。为了正确地访问这些内存单元,必须为每个内存单元编上号,然后根据内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫作“内存地址”。

内存单元的地址与内存单元中的数据是两个完全不同的概念。如同宿舍房间号(地址)与住在其中的人(数据)一样,是完全不同的两回事。

2.变量名、变量地址和变量值

“变量名”是给内存空间取的一个容易记忆的名称,如同上网时的域名一样,可方便用户使用(实际上起作用的是IP地址);“变量地址”是系统分配给变量的内存单元的起始地址;“变量值”是变量的地址对应的内存单元中所存放的数值或内容。

为了帮助读者理解三者之间的联系与区别,不妨举个例子。假如有一幢教师办公楼,各房间都有一个编号,如1001、1002、1003…一旦各房间被分配给相应的院系部门后,各房间就挂起了部门名称牌,如计算机系、电子工程系、工商管理系、通信工程系等。假设计算机系被分配在1001房间,若要找计算机系的教师(即值或内容),可以去计算机系找(按名称找),也可去1001房间找(按地址找)。类似的,对一个存储空间的访问既可以指出它的名称,也可以指出它的地址。

图7-1 内存分配的存储单元

凡在程序中定义的变量,当程序编译时,系统都会给它们分配相应的存储单元。计算机的C语言系统给整型变量分配两个字节,给实型变量分配4个字节。每个变量所占的存储单元都有确定的地址,具体的地址是在编译时分配的。

例如:int a=7,b=8;float c=2.7;其在内存中的情况如图7-1所示。

要访问内存中的变量,在程序中是通过变量名来引用变量的值的。如printf("%d",a)。实际上,在编译时,每一个变量名将对应一个地址,在内存中是不再出现变量名而只有地址。程序中若引用变量a,系统便会找到其对应的地址2000,然后从2000和2001这两个字节中取出相应的值。又如scanf("%d",&b),其中的&b指的是变量b的地址(&是地址运算符),执行scanf函数时,将从键盘输入一个整数值送到&b(即地址2002)所标示的存储单元中。

从用户的角度看,访问变量a和访问地址2000是对同一内存单元的两种访问形式;而对系统来说,对变量a的访问,归根结底还是对地址的访问,内存中并不存在变量名a,而是系统将变量a与地址2000建立了映射对应关系。因此执行语句“int a=7,b=8;float c=2.7;”时,编译系统会将数值7、8、2.7依次填充到地址为2000、2002和2004的内存空间中。(www.daowen.com)

3.变量的访问方式

系统对变量的访问形式可分为直接访问和间接访问。

(1)直接访问

要访问变量必须通过地址找到该变量的存储单元。由于通过地址可以找到变量单元,因此可以说一个地址“指向”一个变量存储单元。例如,地址2000指向变量a,2002指向变量b等。这种通过变量名或地址访问一个变量值的方式称为“直接访问”。

(2)间接访问

“间接访问”方式就是把一个变量的地址放在一个特殊的变量中,利用这个特殊的变量进行访问。如图7-2所示,特殊变量p存放的内容是变量d的地址,利用变量p来访问变量d的方法称为“间接访问”。

图7-2 间接访问

存放地址的变量是一种特殊的变量,它只能用来存放地址,而不能用来存放其他类型(如整型、实型、字符型)的数据,需要专门加以定义。

(3)两种访问方式的比较

为了让读者容易理解两种访问方式的实质和不同,不妨再打个比喻。假设为了开一个A抽屉,共有两种办法:一种是将A的钥匙带在身上,需要时直接找出A的钥匙打开抽屉,取出所需的东西,这相当于直接访问;另一种办法是为安全起见,将A的钥匙放到另一抽屉B中锁起来,如果需要打开A抽屉,就需要先找出B钥匙,打开B抽屉后取出A钥匙,然后再打开A抽屉,最后才能取出A抽屉中的所需之物,这就是“间接访问”。

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

我要反馈