C语言程序设计中的指针教学研究

2015-11-23 02:36韦纯福李
大众科技 2015年7期
关键词:数组指针C语言

韦纯福李 波

(1.河南理工大学数学与信息科学学院,河南 焦作 454000;2.河南理工大学安全科学与工程学院,河南 焦作 454000)

C语言程序设计中的指针教学研究

韦纯福1李 波2

(1.河南理工大学数学与信息科学学院,河南 焦作 454000;2.河南理工大学安全科学与工程学院,河南 焦作 454000)

指针是C语言程序设计的重要数据类型,亦是C语言的精华部分。但是,由于指针概念复杂,使用灵活,在实际的教学过程中学生常常感到难以理解。文章拟从指针的基本概念入手,分析函数指针、指针函数、数组指针及指针数组的区别与联系,通过类比分析方法阐明该部分内容,以期能够帮助学生深入理解指针原理及其应用。

C语言;指针数组;数组指针;函数指针;指针函数

1 引言

C语言是一种面向过程的计算机高级语言且在国际上广泛使用,其历史悠久,发展相当迅速。指针是在C 语言程序设计中一个重要的概念,鉴于指针概念较复杂,使用方式多样,学生通常感到难以理解掌握。因此,学习C语言时应遵循序渐进的方法,从指针的概念入手,理解指针的内涵,指针变量的定义与赋值方式,以及它与普通变量的差别与联系。指针是C 语言程序设计学习的重点与难点之一,学生不能掌握指针该知识点,那么就很难学好C 语言。加之指针数据类型较多,书写格式容易发生混淆。比如数组指针与指针数组,函数指针与指针函数等。这些容易发生混淆的概念与定义为学生理解指针带来了极大的困难。学生若能熟练掌握指针、灵活运用指针,则可编写出高效、紧凑、简洁的程序。众多教育工作者[1,2]对指针教学进行了积极的探索。本文基于谭浩强与贾宗璞等[3,4]研究者先期研究成果,从C语言的基本概念与定义出发,结合学生学习过程中容易发生混淆的指针教学内容,初步探索C语言教学中指针教学的相关问题,并把容易混淆的的指针教学知识点进行类比分析,以期对C语言的初学者有所帮助。

2 指针的基本概念

学生学习指针应首先掌握其基本概念与定义。基于地址的概念再向学生介绍指针的定义,以帮助学生对指针的理解。如果告诉学生指针即地址、地址即指针,在程序的执行过程中,变量、函数、数组等都存放在计算机的内存单元中,内存中的存储单元都有对应的地址,这样更能帮助学生快速理解指针。需要向学生进一步阐述使用变量、数组、函数既可以直接访问,又可以利用其存储单元的地址进行间接地访问,这种间接访问便可以借助指针来完成的。学习指针复杂的使用形式之前,需要让学生充分理解指针与变量。

2.1地址和指针的理解

依据冯.诺依曼提出的“存储程序”的电子计算机的工作原理,数据与程序需要装入内存后方可进行处理。计算机内存是以字节为基本单位的一片连续存储区域,每个字节都有一个唯一的编号,该编号称为内存的“地址”。C语言提供了一种通过地址间接存取的方式,先用一种特殊的变量存放要访问变量的地址,访问时先从该特殊的变量中取出需要访问变量的地址值,再依据该地址值去访问对应的存储单元。由于地址就像要访问存储单元的指示标,于是形象地称地址为指针,要访问的存储单元也形象地称为“指针所指向的对象”。

2.2指针变量的理解

向学生介绍此部分内容时,应参照普通变量的定义形式,赋值方式,以便帮助学生快速地理解指针变量的定义及使用形式。指针变量也需要先定义后使用,其定义形式如下:

基类型 *指针变量名1,*指针变量名2,…;

定义中的“*”用来标示所定义的变量是一个指针变量,这里的“*”不能省略;“基类型”表示该指针变量所指向对象的数据类型,其可以为任意数据类型。例如:

float *pa; /*pa是指向float型变量的指针变量*/

int *pb; /*pb是指向int型变量的指针变量*/

指针变量仅能指向预先定义时基类型所规定的类型变量,而不能指向规定之外的其他类型的变量。由于指针是内存地址,指针变量只能用来存放指针。指针变量同普通变量一样,同样也具有普通变量的三要素:变量类型、变量名和变量值。

3 指针数组与数组指针的理解

笔者在指针数组与数组指针的教学过程中,发现学生在理解这部分内容时容易发生混淆。为此,通常将这两部分内容放在一起进行类比分析讲解。

3.1指针数组

将指针数组和普通数组进行类比分析讲解,不同在于普通数组元素是普通类型的数据,而指针数组的元素都是指针。由此引出指针数组的定义,如果一个数组的元素值为指针,则称这个数组为指针数组。指针数组各元素具有相同的基类型,是一组有序的指针的集合。指针数组的一般定义形式为:

类型标识符 *数组名[数组长度]

例如: float *pa[5];

表示定义了一个包含5个数组元素的指针数组pa,每个元素都是一个指向实型变量的指针。为了加深学生对指针数组的理解,下面列举笔者在课堂教学过程中经常用到的一个指针数组的例子及讲解方法。

程序的运行结果为:

笔者讲述此例题时,通常会预留几分钟时间给学生,让学生先阅读分析此程序的运行结果。然后与VC++编译运行之后的结果相对照。笔者在进一步讲解pa是一个指针数组,它的三个元素分别指向静态二维数组a的三行等。

3.2数组指针

数组指针变量定义形式:

类型标识符 (*数组名)[数组长度]

例如: float (*pa)[5];

告诉学生在指针数组的基础上,如果“*数组名”的两边加上括号,其意义则发生改变。方括号“[5]”前面(*pa)不是合法的标识符,由此判定(*pa)[5]不是数组。而定义中有*pa,则pa为指针变量,后面又有方括号“[5]”,即可判定是和数组有关的指针变量。它表示了一个指针变量pa, pa指向的对象是包含5个float型元素的一位数组。进一步通过算例让学生明白其与指针数组的区别。

程序的运行结果为:

首先引导学生读懂该程序,以两种不同的方式输出二维数组的元素,其中包括数组指针即指向二维数组行的指针。其次,将其与指针数组的例子进行对比分析,以加深学生对数组指针与指针数组的理解。

4 函数指针与指针函数的理解

在指针教学过程中,除指针数组与数组指针之外,笔者发现函数指针与指针函数是学生又一对容易发生混淆的知识点。虽然字面意思相近,但是用法却相距甚远,为此,笔者经常采用类比分析讲解此部分内容。

4.1函数指针

程序装入内存以后,每一个函数都要占用一段连续的内存区域,而函数的名称即是这段连续区域的首地址(又称为函数的入口地址)。在C语言程序设计中,能够把一个函数的首地址赋值给一个指针变量,使其指向该函数,即可通过这个指针变量调用该函数。习惯上把这种指向函数的指针变量称为“函数指针变量”,简称函数指针。函数指针变量的一般定义形式为:

类型标识符 (*指针变量名)(类型标识符1,类型标识符1…);

定义中的第一个“类型标识符”表示了被指函数返回值的类型,其余类型标识符用来说明所指向函数参数类型和参数个数,通常括号内的类型标识符要与所指函数参数类型相对应。若所指向的函数没有形式参数,这一对圆括号也不可以省略。比如:

语句中的pa是一个指向函数的指针变量,其所指向的函数返回值必须为整型,且有两个参数,分别为整型和指向整型的指针。为进一步向学生阐述清楚函数指针的内涵,笔者通常采用如下程序进行说明。

程序中 pmax是一个指针变量,指向返回值为整型的函数,通过pmax调用max函数,需要向学生阐明函数指针变量不能进行相应的算术运算,这一点有别于数组指针不同,数组指针可以通过指针变量的加减进行移动,而函数指针的移动则无意义。提醒学生需要注意“*pmax”两边的括号不能省略,此处的“*”仅仅是一种指示符,不应理解为指针运算符。

4.2指针函数

向学生阐明指针函数的字面意思,指针用来修饰函数,该函数不同于普通函数,如函数返回值为整型数据、实型数据的常称为普通函数。进一步说明函数类型是指函数返回值的类型。C语言程序设计中允许一个函数的返回值为一个地址(即指针),并把这种返回指针值的函数称作指针函数。指针函数的一般定义形式为:

定义中,函数名称之前加了“*”,且无括号,表明该函数函数返回值是一个指针,即指针函数。其中类型标识符表示返回指针值的基类型。例如:

上述表示pf为指针函数,其返回值的指针指向一个实型变量。可通过如下程序进行进一步说明。

上述程序把两个形式参数中较大的那个数的地址作为函数值返回。需要注意:函数指针与指针函数表示了两种完全不同的含义。float *fun( )是一个函数声明,fun表示一个指针函数,其返回值是一个指向实型数据的指针,“*fun”的两边没有括号。而int (*pmax )( )则为一个变量声明,表示pmax 是一个指向函数入口地址的指针变量,该函数返回值为整型数据,“pmax”两边不能缺少圆括号。

5 结论

根据C语言初学者在学习指针时常常遇到的难题以及容易发生混淆的概念,笔者分析总结了地址、指针、指针变量等的基本概念及区别与联系;进一步类比分析了指针部分容易混淆的指针数组、数组指针、函数指针、指针函数等内容,分别通过程序说明的他们的定义、使用形式及其区别。经过分析与比较指针教学知识点之间的区别与联系, 既能激发学生学习指针这部分内容的动力,又能提高他们的自学C语言的能力。系统、灵活地掌握指针可以提高学生的编程能力,并且能够提高他们学习C语言的自信心。经过反复的教学实践与总结,笔者总结出的通过类比分析教学方法学习指针,能够有效降低教学难度,达到了理想的教学效果。

[1] 赵忠孝,杨亚蕾.对C语言指针教学问题的探究[J].计算机教育,2009,(19):72-74.

[2] 李俊萩,赵家刚,张晴晖.C语言指针教学中的知识点分析与总结[J].计算机教育,2011,(8):55-60.

[3] 谭浩强.C语言程序设计[M].北京:清华大学出版社,2000.

[4] 贾宗璞,许合利.C语言程序设计[M].北京:人民邮电出版社,2011.

Research on pointer teaching of C language

Pointer is an important data type of C language programming and is also the essence. College students often feel difficult to understand pointer in the actual teaching process, because of complex concept and flexible use of pointer. Distinction and connection among pointer array and array pointer, function pointer and pointer function will be studied based on basic concepts of pointer, they will be clarified by analogy analysis method, in order to help students understand the principle and application of pointer.

C language;pointer array;array pointer;function pointer;pointer function

G64

A

1008-1151(2015)07-0136-03

2015-06-10

韦纯福(1979-),男,河南理工大学数学与信息科学学院讲师,博士,从事智能信息处理、矿山信息化的教学与研究工作。

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