C语言指针教学方法探讨

时间:2022-09-29 03:35:56

C语言指针教学方法探讨

文章编号:1962-5913(2008)15-0111-04

摘要:指针是C语言的重点,也是教学难点。本文基于计算机教学实践,分析了边疆学生学习C语言指针过程中存在问题的原因,提出了适用的教学方法,提高学生理解和应用指针的能力,进一步增强教学效果。

关键词:指针;教学现状;教学方法

中图分类号:G642

文献标识码:B

1引言

C语言是程序设计语言中专业性较强的语言[1,2],为适应信息化社会对人才培养的要求,我区各高校普遍开设了C语言程序设计这门课。由于我区是少数民族居住区,各高校少数民族学生占较高比列,他们虽然具有一定的汉语水平,但是在学习计算机课程时对专业词语生疏,因此在语言理解方面存在较大困难。指针又是C语言的精华,指针变量提供对内存单元的间接访问方式,不同于以往的直接访问方式。同时,指针数据类型繁多,书写格式相近,使用不当容易引起混乱。这些加大了少数民族学生对指针的理解难度。但是另一方面,利用指针可以对不同数据结构进行快速处理,还可以为函数间各类数据的传递提供简便方法,灵活应用指针,可以编写出简洁、紧凑、高效的程序。指针是教学的重点,学生不仅要理解而且要灵活应用。为了突破教学中的难点,本文先对指针内容和教学现状进行了分析研究,在此基础上提出了适用的教学方法,目的是进一步提高边疆地区C 语言的教学效果。

2指针教学内容和教学现状的分析研究

2.1指针的特点决定学习难度

(1) 概念多,易混淆

在指针章节中,许多概念容易混淆,如变量的指针和指针变量,指针数组和数组指针,指针函数和函数指针等。变量的指针是变量的地址,指针变量是专门存放地址的变量;指针数组是每个元素均为指针变量的数组,而数组指针是指向数组的指针;指针函数是返回值为指针的函数,而函数指针是函数的首地址。微小的差别,却表示不同概念。

(2) 数据类型多

引入指针概念后,可以定义出许多新的数据类型。如:整型指针变量、字符型指针变量、实型指针变量;整型指针数组、字符型指针数组、实型指针数组;指向一维整型数组的数组指针、指向一维字符型数组的数组指针等,并且数组下标值不同或数组维数不同,表示定义了不同的数组指针变量;除此之外,还有指针函数类型和函数指针类型以及指向指针的指针数据类型等。

(3) 语法要求苛刻

指针内容的语法细节要求严格,如:(*p)++和*(p++),p为指针变量,仅括号位置不同,表示不同意义。前者表示p所指向变量的值加1,后者表示先对p的原值进行*运算,然后使p的值改变。

(4) 指针应用灵活

指针应用非常灵活,可以应用于普通变量,数组,字符串,函数等,对所指向的数据进行操作。熟练的编程人员,利用它可以编写出颇具特色、高质量的程序,实现其它高级语言难以实现的功能,但是初学者应用指针十分容易出错。

2.2教学现状

(1) 教学目标

掌握指针类型及其表示方法;应用指针访问数组;应用指针对字符串进行操作;了解指向函数的指针和返回指针值的函数概念;了解指向指针的指针概念。

(2) 教学内容及安排

①指针,指针类型,指针变量。具体包括:地址和指针概念;定义、引用指针变量;指针变量作函数参数。

② 数组与指针。具体包括:应用指针访问一维数组元素;用数组名作为函数参数;了解指针访问多维数组元素等。

③ 字符串与指针。具体包括:字符串表示形式;应用字符串指针作函数参数;应用字符串指针变量实现对字符串操作。

④ 函数与指针。具体包括:函数指针变量的定义和引用;返回指针值的函数的定义和引用。

⑤ 指向指针的指针概念。

(3) 教学现状分析

目前,大多数高校采用先进的多媒体设备辅助教学,增强了课堂教学的新颖性和生动性,但是教学方式仍局限于传统方式――从语法角度按部就班地罗列语法知识,并且多媒体教学过多追求情节和画面,分散了学生的注意力,使学生对指针的理解过于肤浅,作题时不知所措。每学期期末,在对本校非计算机专业学生C语言试卷调查中发现:即使指针试题是判断题或选择题,90%的学生仍会失分。

教学实践证明:对于抽象复杂的指针概念,采用板书的教学方式,教学效果明显高于多媒体。一方面:教师在黑板上书写过程中,学生有充分时间理解和思考;另一方面:教师可以根据学生的反应,灵活调整授课内容或者改变教学方法。以下,根据指针内容概念多,难理解;数据类型多,难区分;语法细节多,使用灵活等特点,本文提出了适用的教学方法。

3指针教学方法探讨

3.1由已知学习未知,进行比较和对照

知识和技能的悉得,除掌握正确方法外,还需要扎实基础,学习C语言也不例外。学生对C语言基础知识掌握的熟练程度,直接影响指针的教学质量。在指针章节中,大部分内容与前面知识有关,在教学过程中,如果忽略概念间的相似点,将耗费学生较多精力学习新内容;如果缺乏概念间的对比,将使学生很难深刻理解所学内容,容易引起混淆。

以学习“指针变量”为例,首先应该清楚“指针变量”也是“变量”,固具有“变量”的特点,如:变量值可以改变;任何变量名必须先定义,后使用;变量名表示一个符号地址等。其次,要明白“指针变量”与“变量”的区别:指针变量的存储单元中,存放的是地址值而非数值。由此“指针变量”与“变量”之间的联系和区别总结如下:

(1) 指针变量的值可以改变;不过其值一旦改变,表示指向不同存储单元。

(2) 在引用指针变量之前必须先定义,标识符即为指针变量名;与一般变量的定义不同的是:指针变量的数据类型与它本身没有关系,仅表示它所指向的数据的数据类型;变量名前需加“*”;此外,在引用之前,还必须将相应类型变量的地址先赋给指针变量,以确保指针变量有确切指向,不至于破坏内存中的系统数据。

(3) 虽然指针变量存取的是地址值,但是同一般变量一样,指针变量名也表示一个符号地址,编译时为其分配存储单元。

以下通过表1,对比变量与指针变量的定义和引用形式:

程序1运行时,变量i的内存状态如图1所示:

程序2运行时,变量i和p的内存状态如图2所示:

分析说明:如果把存储单元比喻成房间,则内存地址相当于房号。C语言的内存地址是一个从0 到65535之间的整型值。编译时系统自动为每个变量(包括指针变量)随机分配内存地址。如:程序1中变量i的内存地址是3001;程序2中变量i的内存地址是2301,指针变量p的内存地址是4000。程序2中语句“p=&i;”相当于“p=2301;”,其作用是使p指向了i;语句“*p=20;”相当于“i=20;”,作用是将数值20写入i所在的存储单元。

这种帮助学生充分利用所学知识和经验,理解和掌握新内容的方法,在认知心理学领域称为“正迁移”。文献[3]提出,在教学过程中,如果能全面了解和准确把握迁移规律,将有效增强学生的认知能力和记忆能力,提高学习成绩。实践证明:新、旧知识之间进行比较和对照(对照显现出相同,比较体现出差异),将有助于学生快速发现迁移规律。如果运用同样的方法,由数组学习指针数组,由函数学习指针函数,由指针变量学习指向指针的指针变量等,那么指针的教学难度将明显降低,学生将快速而有效地掌握更深层次的指针概念。

3.2善于罗列和总结

针对指针概念多、数据类型多,易混淆的特点,在教学过程中,如果善于发现规律,对所学知识进行“罗列和总结”,那么将增强知识结构的系统性和完善性,同时将零碎的知识点串联起来,提高学生的记忆能力和辨别能力,进一步改善教学效果。

以数组与指针为例,学习了指针之后,运用指针法同样可以表示数组元素,且该方法使目标程序占内存少,运行速度更快。但是面对下标法和指针法引出的多种表示形式,初学者往往难以准确区分,使用时容易出错。表2对两种表示数组元素的方法进行了全面总结。

说明:表中a代表数组名,p代表指针变量名,p的初值为a(p所指向的数据的数据类型与a数组元素的数据类型一致)。下标法中a[i]表示数组元素的值,&a[i]表示数组元素的地址;指针法中*(p+i) 表示数组元素的值,p+i表示数组元素的地址,这些表示形式学生容易理解。但是,下标法“*(a+i), a+i”和指针法“p[i],&p[i] ”这两种表示形式比较抽象,学生不易理解,需要进行简单推理。观察表2后发现:下标法“*(a+i), a+i”与指针法“*(p+i), p+i”类似,之所以也可以这样表示,原因在于p的初始值为a,则a+i 和p+i都指向a数组第i个元素;指针法“p[i],&p[i] ”与数组法“a[i],&a[i] ”类似,原因在于“[ ]”是变址运算符,a[i]表示按a+i计算地址,再取值,而p+i和a+i含意相同,则p[i]等价于a[i]。

通过全面的总结和简单推理,初学者将比较容易掌握所有表示方法,并且牢记各种表示形式的真实含义,使用时能轻松驾驭,不致于混淆出错。

理解了指针与一维数组的关系,对于二维数组的表示形式,也可以通过“总结”的方法,加深理解记忆[4]。如语句:int a[3][4]; 定义了一个三行四列的整型二维数组,共十二个元素,见图3 (在内存中,依据按行存放的原则) ,把二维数组a看作是一个特殊的一维数组,它有三个元素:a[0],a [1],a [2];每个元素又是一个一维数组,如a [0]是四个元素:a [0] [0],a[0] [1],a[0] [2],a[0] [3]的数组名,以此类推。

根据二维数组的特点,指针分为行指针和列指针,行指针有两种表示形式:“a+i和&a[i]”。由图3学生很容易理解“a+i”表示行指向的指针,此外“&a[i]”也表示行指针,原因是:此时a[i]为一维数组的数组名,表示列指针,而列指针前加上“&”就转换成行指针了。需要强调的是:二维数组的行指针只指向具体的行地址,二维数组的列指针才指向具体的存储单元,按照指针访问方式的不同,对二维数组的数组元素的各种表示形式总结如下(见表3,其中 ):

经过总结,二维数组元素的各种表示形式就容易区分了。

在教学过程中,要善于发现规律,这样才便于从不同角度对指针内容进行总结,发现知识点之间的相关性,将零散的知识串联起来,加深理解和记忆。如:指针章节中,起始至终都贯穿着指针变量,那么从指针变量的主要用途出发进行总结,见表4:

由上表可以看出,指针变量用途广泛:使用指向单变量的指针变量作为函数参数,在主调函数中可以得到多个变化了的值;使用指向数组的指针变量,可以大大提高执行效率;使用指向字符串的指针变量构成指针数组,在处理多个字符串时,可以节省内存空间,也可以提高程序的执行效率;使用指向函数的指针作函数参数,可以使一个通用函数实现专用功能;使用指向指针的指针变量,可以实现变量的二级寻址[5]。指针变量灵活的使用方式,往往让初学者眩晕。但是从表4指针变量的表示形式这一列中发现,所有指针变量具体应用时,都遵循规律:(1)先定义;(2)再赋值;(3)再引用。通过归纳和总结,学生看到了变化中不变的性质,在具体应用时,才会以不变应万变,降低学习难度。

3.3注意语法细节,勤于上机实践

指针应用灵活,值得注意的语法细节较多,如:p为一个指针变量,p++的含义,已不是简单的将p值加1,而是p+1*d,d=sizeof(p所指向的数据的数据类型)。这些细微之处直接影响学生实际分析程序,理解程序和编写程序的能力。但是,过多拘泥于细节,又会使学生感到枯燥无味。为了促进学生正确掌握语法知识,培养学生实际的编程能力,在整个教学过程中,上机实践必不可少[6]。具体方案如下:

(1) 开设验证性实验。要求学生大量上机,调试教材中现有的程序,弄清语法细节,不断积累经验。

(2)开设设计性实验。教师根据学生的实际情况,指定上机题目,学生在课前设计算法、编写程序,在上机课上对编写的程序进行调试、修改。整个实践环节,遵循循序渐进的原则。教师应该启发学生,如:相同的问题能否采用不同的方法解决?用同一方法能否解决不同问题?等等,不断拓宽和提高学生的编程思维。

总之,C语言是一门实践性很强的课程,只有不断上机摸索,才能熟练掌握并灵活应用。

4总结

C语言是计算机专业和相关专业的一门重要基础课程,指针是C语言的重点,但是因其概念复杂、使用灵活,大多数学生难以掌握。在实际编程过程中,学生更容易出错,而且错误难以发现。这对教师的教学水平提出更高要求,教师不仅要对C语言指针有深刻理解,而且要有丰富的教学经验,激发学生的学习兴趣。经过多年教学实践,本文总结出以上三种有效的教学方法。实践证明:灵活运用这些方法,将有效降低教学难度,并取得理想的教学效果。

参考文献:

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

[2] 王柏盛. C程序设计[M]. 北京:高等教育出版社,2004.

[3] 苗丽萍,安志红. 现代认知结构论对教学的指导作用[J]. 佳木斯大学社会科学学报,2004,(5).

[4] 李振涛. C语言多维数组与指针的探讨[J]. 长春师范学院学报,2003,22(2):30.

[5] 李素萍. C语言指针的应用[J]. 中国科技信息,2005,(21).

[6] 温娟娟. C语言中指针的探讨[J]. 河南职业技术师范学院学报,2003,(9).

上一篇:艺术设计专业“计算机动画设计”教学的一些思... 下一篇:远程教育教学质量评估系统设计与实现