C语言中指针的用法
2010-09-04武汉大学计算机学院李晶张彦芳
武汉大学计算机学院 李晶 张彦芳
焦作师范高等专科学校计算机与信息工程系 郭艳丽
C语言中指针的用法
武汉大学计算机学院 李晶 张彦芳
焦作师范高等专科学校计算机与信息工程系 郭艳丽
一、指针的定义
在C语言中,指针是一种很重要的数据类型。程序运行时,所有的数据都存放在计算机的内存单元中,为了能够正确的访问这些内存单元,在计算机内部,所有的内存单元都要统一的进行“编号”,也就是说,所有的内存单元都要有地址,并且具有唯一的内存地址。一个变量在内存中对应一个单元地址,通常把这个地址称为指针。
在C语言中,指针定义的一般形式为:类型说明符*指针名。
与其他程序设计语言有所不同,C语言允许使用变量的地址来访问变量,这就意味着C语言中除了有存储数、字符等内容的普通变量外,还有一种特殊的变量。这种变量存储的是另一个变量的地址,而不是通常意义下的数和字符,这种存储地址的变量称为指针变量。例如,当变量a存储了变量b的地址,就称变量a指向了变量b。
二、指针的引用
1.指针的初始化。数据类型*指针名=初始地址值。例如:inti,*p=&i。在这需要注意几个问题,首先指针变量在使用前需要先赋值,其次指针所指的变量已经说明过,而且指针与所指变量类型应该一致,最后还需注意不能对指针赋非地址值。
2.指针变量的引用。例子如下。
本程序首先定义指针变量p和q,并在定义的时候对变量p初始化,使它指向变量m。赋值语句n=*p*2-3表示将p所指向的存储单元中的值28乘以2再减去3,再将这一表达式的值赋给变量n。q=&c1表示指针变量q指向字符变量c1的存储单元。赋值语句*q=c2+1表示将字符’g’送入q指向的存储单元中。最后程序运行的结果为:
在这里需要注意,当*p出现在变量定义中的时候,表示定义了指针变量p;如果出现在表达式中则表示取p所指对象的内容。
三、指针与数组
在C语言中,指针与数组有着十分密切的联系。可以说程序中凡是用数组处理的算法都可以通过指针实现,而且速度要比下标法快得多。
1.指针与一维数组。假设有定义语句:inta[100],*p=a;将数组a的首地址赋予了指针变量p,这就使指针变量p指向了数组a的第一个分量a[0]。由于数组的存储结构是连续的,即数组元素在内存中是连续存放的,因此a+i就是a[i]的存储地址&a[i],*(a+i)表示取a+i地址中的内容。当指针变量p指向数组的首元素a[0]时,p+i就代表a[i]的地址,*(p+i)就代表a [i]。当指针p指向一维数组中的某个分量时,执行p++或p--就表示使指针p后移或前移一个存储单元,其位移的字节数取决于基类型。
2.指针与二维数组。当指向数组的指针处理二维数组时,有以下使用规则:
p是行指针,p+i、p++或p--均表示指针移动的单位是行;p只能指向二维数组中的行,而不能指向一行中的某个元素,但是可以通过p引用二维数组中的元素,例如引用a[i][j]可以用表达式*(*(p+i)+j)或*(p[i]+j)来表示。引用a[i][j]的地址可以用*(p+ i)+j或p[i]+j表示;指针名p与二维数组名a虽然都代表“行指针”,但指针名p为变量,所以它可以被赋值,而二维数组名a不能被赋值。
四、指针与函数
在C语言中,指针与函数之间存在着广泛的联系,其中最基本的联系就是指针变量作为函数的参数。将函数的参数设置为指针变量可以实现通过参数将函数值带出函数体的目的。
除此之外,我们还能够在程序中使用函数指针。指向函数的指针,称为“函数指针”。借助于该指针能够使函数如同普通变量一样的被传递和调用,用函数指针作为函数的参数能够提高函数的通用性。
五、结束语
指针是C语言中最有风险、最难掌握的知识点。它内容丰富、概念复杂、用法灵活,若使用不当或误用会造成不良后果,轻则得到错误的运行结果,重则造成程序挂死乃至系统失控,因此建议使用者必须透彻理解概念,并多上机调试程序,从而弄清细节,积累经验。