C语言中指针的研究与总结

2012-04-29 23:47李祥琴
科教导刊 2012年6期
关键词:数组指针C语言

李祥琴

荆楚理工学院计算机工程学院 湖北·荆门 448000)

摘 要 指针在C语言学习中起着举足轻重的作用,c语言学的好不好关键在于对指针的掌握。本文介绍了指针学习的现状、引入指针的作用,并对C语言指针中较易混淆的概念进行了详细阐述,最后探讨了指针与数组、函数的关系和使用方法。

关键词 指针 C语言 数组 函数

中图分类号:TP393 文献标识码:A

Study and Summary on Pointer in C Language

LI Xiangqin

(School of Computer Science, Wuhan University, Wuhan, Hubei 430079;

School of Computer Engineering, Jingchu University of Technology, Jingmen, Hubei 448000)

Abstract Pointer in C language learning plays an important role, the key is to master the pointer in C Language. This article describes the learning status of pointer, the role of introduction of the pointer, and C language pointer more confusing concepts were elaborated, and finally explore the relationship between pointers and arrays, functions, and use.

Key words pointer; C Language; array; function

0 引言

指针是C语言的精华,也是大学《C语言程序设计》①课程教学的重点与难点。通过使用指针变量可以较方便地使用字符串、数组,可以表示各种数据结构,从而能够编写出执行效率高、可读性强的程序,它在很大程度上增强了C语言的功能。

对于一个不涉及指针、只有程序设计结构、函数和数组的程序,许多学生在分析它时还觉得得心应手,一旦引入了指针,便不知所措。究其原因,对指针的理解只停留在表层,没有从较深层次去理解。指针的概念本身比较复杂,涉及指针与地址、普通变量与指针变量、指针与函数、指针与数组,使用也比较灵活,需要多思考、多总结、多上机,在实际操作中才能逐渐掌握。因此,如何学好C语言中的指针成了一个值得研究的课题,下面就几年来在实践教学过程中存在的想法进行总结和学习。

1 引用指针的作用

通过定义指针变量可以确定存储单元的地址和类型,如有int i, *p=&i;则变量i与*p是等价的,在程序中可以用变量i和*p两种方式来访问存储单元。因此,指针变量是一种新的访问存储单元的方法,它的作用主要表现在三个方面:

(1)能够突破变量作用域的限制。程序中通常把一部分代码放在一个函数中,基于函数的封闭性,有些操作我们不能在它的外部执行,比如利用函数交换两个实参的值。当使用指针变量作参数时,实参传递的是对应存储单元的地址,若利用形式参数直接访问对应存储单元,将会打破变量作用域的限制,可以在函数中使用外部的存储单元。

(2)可以提高函数的执行效率。形参相关的存储单元较大时,如结构体,函数执行中用实参赋值给形参将花费较多时间和存储空间。如果把形参的类型换成相应的指针类型,函数的执行效率则会大大提高。

(3)使用未命名的存储单元。内存中的堆存储空间在程序运行中是用户自己申请并指定大小,一般通过调用库函数来完成,没有变量直接参与,只能利用指针变量间接引用的方式实现。

2 指针中较易混淆概念的理解

2.1 指针变量和指针运算符

C语言中通过变量使用计算机中的内存,变量是内存中某块存储单元的标识,它用来存放数据,如整型变量存储整数,浮点型变量存储实数。指针变量也是一种变量,定义一个指针变量就会有一块存储单元与之对应,只是它存储的是地址,是某类型的地址,如实型指针变量只能存储实型变量的地址,短整型指针变量只能存储短整型变量的地址。

指针运算符“*”在指针中一般在两种情况下出现:第一种是定义指针,如inti=13,*q;第二种是在赋值语句或程序执行中出现。第一种中“*”代表该变量的类型是指针型变量,指针变量名是p,而不是*p。第二种中 “*” 运算符表示取它指向的内容,*q表示指针变量q所指向的变量。

比如给指针赋值,可以采用两种方法: ① int i=3,*p; p=&i ② int i=3,*p=&i分别是先定义后赋值和边定义边赋值。实际教学中许多学生在先定义后赋值p=&i中常常将p错误写成*p ,主要是没有弄清楚概念,&i表示变量i的地址,而*p表示p指向的变量,变量的内容是数据,数据和地址是两种不同的值。

2.2 指针变量与自增自减运算符混合

许多学生在编程过程中总是辨不清(*p)++与*p++,其实仔细分析不难发现这两个表达式在程序执行时是有规律可循的。比如有int i=3,*p; p=&i成立,则(*p)++可以(下转第141页)(上接第114页)先求括号中的内容,再进行自增运算,相当于i++ ;而对于*p++来说,它需要考虑运算符的优先级和结合方向。由于自增运算符++与指针运算法*优先级别相同,结合方向又为自右而左,它相当于*(p++),可以分成两步进行计算,第一步执行*p,即i的值,第二步执行指针移动p=p+1, p值发生改变。

2.3 数组名和函数名

数组名不能代表整个数组。C语言规定数组名(不包括形参数组名,形参数组并不占据实际的内存单元)代表数组中首元素的地址,②即序号为0的元素的地址。

假设a是一维数组,如inta[10]; ,数组名a代表数组首地址,则a+i代表从首地址开始,往后偏移i个位置,即相当于是数组元素a[i]的地址。因此,a和&a[0]都代表第一个元素的地址,同理a+i和&a[i]都代表第i+1个元素的地址。

假设b是二维数组,如intb[4][5]; ,可以把数组b看成包含4个元素的一维数组(b[0]、b[1]、b[2]、b[3]),而其中每一个元素又是一个一维数组,包括5个元素。因此,在二维数组中数组名b代表数组的首地址,b+1是序号为1的行的首地址或称第2行的首地址。

跟数组名一样,函数名可以退化成指针。函数名是函数的地址,也就是入口地址。

3 指针与数组、函数的关系

3.1 指针与数组

指针可以指向数组,而数组也可以是指针数组。因此,指针与数组关系中有指向数组元素的指针和和指针数组。两者在形式上很相近,但意义不同。

定义指向数组元素的指针与指针变量的定义相似,如int a[10]; int*p;p=&a[0]; ,那么指针变量p指向了一维数组的第一个元素,通过指针下移可以指向数组中其它元素。而且,可以使用下标法(如a[i]形式)和指针法(如*(a+i)或*(p+i))访问一个数组元素。同时,在编程过程中我们经常见到形如int(*p)[10]的表示形式,其中p用来表示指向一维数组,p所指向的对象包括10个整型元素的数组。

指针数组是形如*p[5],它是一个数组,每一个元素都相当于一个指针变量。为了更方便、灵活的处理字符串,引入了指针数组。二维字符数组和指针数组都可以用来存放字符串,如果使用二维字符数组存放则会产生一些问题,比如在定义二维字符数组时,需要规定列数,而实际操作中,给定的各个字符串长度往往不相等,若以最长得字符串长度来限定列数,将会浪费许多内存空间。如果以指针数组来存放,只需将指针数组的各个元素指向相应字符串,通过改变指针数组元素的指向就能改变各元素的值。

3.2 指针与函数

指针可以指向字符变量、实型变量、一维数组、字符串,也可以指向一个函数。函数名代表函数的入口地址,即函数的指针,形如c =(*p)(a,b); ,它用指针形式实现了函数的调用。

函数可以返回整型值、实型值,也可以返回一个地址。形如,int*a(int x,int y);从形式上看,该式子与普通函数的定义比较相似,这里函数名a前多了一个*运算符,它表示函数是指针型函数,一般在该函数内部会再定义一个指针变量,同时给出相应的return语句。

4 总结

指针不仅在C语言中占据核心地位,还在一些课程如《数据结构》③中起很重要的作用,该课程里几乎所有算法的实现都离不开指针。而且,指针也出现在许多重要考试中,如大学计算机等级考试和计算机软件水平能力考试。因此,指针是学好C语言的关键。但C语言概念复杂,使用灵活,大部分学生难以掌握。在上机实验中,学生更容易出错,而且错误难以发现,这不仅要求教师在教学中能够深刻理解指针的概念,做到灵活应用,还需要不断的进行总结、比较和实践,而且要求教师能够利用各种教学手段与方法让学生更容易接受和理解, 同时也要求学生能够深入理解指针的概念、注重上机,在实践中不断学习、提高和完善。

注释

① 任正云,李素若.C语言程序设计.北京:水利水电出版社,2007.

② 谭浩强.C程序设计(第三版).北京:清华大学出版社,2005.

③ 严蔚敏,吴伟民.数据结构.北京:清华大学出版社,2004.

猜你喜欢
数组指针C语言
JAVA稀疏矩阵算法
基于Visual Studio Code的C语言程序设计实践教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程
为什么表的指针都按照顺时针方向转动
高职高专院校C语言程序设计教学改革探索
寻找勾股数组的历程
基于改进Hough变换和BP网络的指针仪表识别
论子函数在C语言数据格式输出中的应用
ARM Cortex—MO/MO+单片机的指针变量替换方法