首页 百科知识 内存数据的指针与指针变量

内存数据的指针与指针变量

时间:2022-10-20 百科知识 版权反馈
【摘要】:在C语言中,可以定义一种特殊的变量,它是专门用来存放变量的存储单元的地址,称为指针变量。例如,n_prt是指向整型变量的指针,简称整型指针。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。这样一来,凡是出现数组、函数的地方都可以用一个指针变量来表示,只要在该指针变量中赋予数组或函数的首地址即可。

9.1 内存数据的指针与指针变量

为深刻理解指针的概念,必须弄清楚内存的概念以及数据在内存中是如何存储的,又是如何读取的。

我们都知道,在计算机的硬件构成中,主机是由运算器、控制器和存储器组成,前两者合在一起称为中央处理器,简称CPU。而存储器又分为内部存储器和外部存储器,简称内存和外存,所有数据只有存放在内存中计算机才能进行处理和运算。内存计量的基本单位是字节,它是进行分配和读取的最小单位,每个字节由8个二进制位(bit)组成,一个字节就是一个内存单元。整个内存空间是一维的,每个字节都有一个唯一的序号,称为内存单元的地址,比如对一个1MB的内存,其内存单元的地址分别为0,1,2,3……。

任何计算机程序只有存储在内存中才能被执行。操作系统要占用一些计算机内存空间,每个应用程序也要占用计算机内存空间。按照面向过程的结构化程序设计方法,程序代码和程序要处理的数据是分开存储的。所以,一个程序在内存中要占两部分存储空间:数据部分和指令代码部分。

此处只考察数据段在内存中的存储情况。当C程序中定义一个变量时,编译系统划分一定数目的存储单元来存储那个变量,存储单元的数目由变量的类型确定,例如,一般微机使用的C语言系统为整型变量分配2个字节,对实型变量分配4个字节,对字符型变量分配1个字节等,若变量分配的不是1个字节,此时以变量分配的第一个字节的地址作为该变量存储地址,这就是内存数据的指针,编译系统把这几个存储单元与变量名联系起来。如有一整型变量,变量名是n,值是999,占用的存储单元是3000和3001两个字节,则变量n的内存地址是3000。

一定要清楚变量的地址与变量的值不是一回事,变量的地址是由编译系统按一定规则进行分配的,一经分配就固定不变,变量的值在程序运行过程中是可以改变的,用户需要关心的是变量的当前值,而不必关心变量的地址,即变量存储单元。

当程序引用这个变量时,可通过变量名自动地访问相应的存储单元,当然程序也可以通过该变量的地址来访问这些存储器单元。按变量地址存取变量值的访问方式称为“直接访问”方式。如对上面提到的变量n,为了得到其值,可直接读出3000和3001两个字节的值即可,赋值语句n=456;将变量n的值改为456,系统只需把456写到3000和3001两个字节中即可。

在C语言中,可以定义一种特殊的变量,它是专门用来存放变量的存储单元的地址,称为指针变量。这样对变量的访问可以采用另一种称之为“间接访问”的方式,例如,我们可先定义一个存放整型变量的地址的指针变量n_prt,不妨设变量n_prt被分配在3086、3087字节,用语句n_prt=&n;将上面的变量n的地址(3000)存放在n_prt中,这样就可以通过指针变量n_prt来访问变量n,即先通过变量n_prt的地址3086得到变量n_prt的值为3000,它就是地址,再访问3000单元的内容,如图9-1所示。

img389

图9-1

如果要将变量n的值改为1234,则用赋值语句“n=1234”;和“*n_prt=1234”;的效果是一致的,前者是直接访问,而后者是间接访问。其中符号“&”和“*”是两个重要的指针运算符“取地址”和“取值”运算符。

需要说明的是,指针类型是对所有类型的指针的总称,指针的类型是指针所指对象的数据类型。例如,n_prt是指向整型变量的指针,简称整型指针。除各种基本类型的指针外,允许定义指向数组的指针、指向函数的指针、指向结构体和共用体的指针以及指向各类指针的指针。在C语言中只有指针被允许用来存放地址的值,其他类型的变量只能存放该类型的数据。

严格来说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。

既然指针变量的值是一个地址,那么这个地址不仅可以是变量的地址,也可以是其他数据结构的地址。在一个指针变量中存放一个数组或一个函数的首地址有何意义呢?因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组、函数的地方都可以用一个指针变量来表示,只要在该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。这也是引入“指针”概念的一个重要原因。

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

我要反馈