C语言指针部分教学心得
2013-05-14杨英翔
杨英翔
摘 要:C语言是国内外广泛使用的一种计算机语言,C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
关键词:C语言;教学
0 引言
C语言是国内外广泛使用的一种计算机语言,C语言功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言不仅是计算机专业学生的一门重要课程,也是高校中非计算机专业学生学习计算机知识的一门重要课程。
作者的C语言课都是在机房里进行的,学生可以人手一机。在C语言的教学过程中,精讲多练,讲练结合,依据学生的能力,采用以学生为主体逐步引导、启发学生。即教师在课堂上起引导的作用,让学生在机学习,边学边练,不断发现问题,解决问题,循序渐进,逐步提高。这种方法打破了课堂教学和实验教学的严格界线,在C语言的教学实践中取得了良好的效果。
1 指针用法
指针通常指向一片存储空间,而空间可采用静态分配或动态分配。静态分配是指在编写C程序时已确定了存储空间。如使用全局变量,static char a[size],则编译器为变量a在程序运行时的数据区内固定分配size字节的空间;如函数内定义一个局部变量charb[size],则在执行函数时,局部变量b在栈上分配size字节的存储空间,函数调用结束时将自动释放局部数组变量b的存储空间。
动态分配是指调用库函数malloc(size)在堆上分配size个字节的连续空间,调用结束后返回一个指向分配好的存储空间的指针,编程时必须考虑到在使用完该存储空间后调用对应的函数free( )来释放掉。
在C编程时,一定要合理使用指针,否则很容易在执行时出现各种错误。以下列出常见的几个错误:
(1)在C程序中定义了一个指针变量,但没有对其进行初始化,将该指针变量称为“野指针”。如果此后对该指针变量所指的存储空间进行操作,程序会出现严重的错误,因为,在定义指针变量后,指针变量的值是不确定的,即指针随机指向某个内存地址,此时的指针所指的内存直接赋值操作,将该单元中原有的数据覆盖,使该数据丢失,若指针指向的是系统的数据区中,会导致系统运行的异常甚至死机。因此,C编程时要及时把指针变量赋值,使指针有正确的指向。
(2)如用语句p = malloc(size)来分配空间,应对分配后的参数p进行检查,如p为NULL则表示分配不到存储空间,此时不能对p指向的空间操作;即使为p分配了空间,也要注意对该指针操作时不能超出其空间范围。使用完后,一定要释放该空间,否则可能引起存储空间的耗尽。
(3)栈溢出。栈是在调用一个子函数时用来保存和恢复现场,以及传递参数和存放局部变量,但在执行子函数时,如果其中的局部变量指针出现使用错误,则会发生栈溢出。例如在子函数中,有下列代码:
char p[8];
strcpy(p,/Notice: This is a test pro-gram!0);
由于栈中为局部变量p只分配了8个字节空间,而strcpy()函数将覆盖p指向的连续32个字节空间(包括字符串结束符-\ 0.),可能将栈中存放的函数返回地址等内容重写了,所以子函数执行完后就无法返回到原来的函数继续运行了。
(4)堆溢出。堆的使用与所在运行平台的操作系统和编译器有关,堆溢出也相对复杂。如程序为:
char *p;
p = (char*)malloc(8);
strcpy(p,/No-tice: This is a test program!0);
则执行strcpy()时将覆盖了紧跟在指针p指向的32个字节的内容,引起堆溢出,程序运行无法正确。
(5)void的用法。void在定义某个函数时,表示该函数无返回值,但库函数void malloc(size)除外,它并不表示malloc(size)无返回值[5],而表示函数的返回值可以转换成任何类型的地址值(如char *,int *等)。void不能用来定义数值变量,但可以用void来定义指针变量,它的真实含义是可以将任何数据类型的地址赋给指针变量。
(6)区分数组和指针变量在使用过程中的不同,指针可以通过加减数值来移动它所指的位置,如p+=5;而数组名是不能移动的,如char k[20]; k++;对k的操作是错误的。
(7)指针移动时挪动的位移与指针所定义的类型相关,如a和b定义为:char *a;int *b;后续的语句:a+=10;b+=10;则表示a向后移动了10个字节,而b向后移动了10个整型长度,即40个字节。指针变量在使用时要与定义的类型相一致,char c[10];int *d;d=c;此后对d的操作很可能造成混乱。
2 课堂教学中注意培养良好的编程习惯
(1)入门阶段。分析和演示运行简单的C程序,和学生一起对程序进行简单修改,再演示运行,让学生对C程序产生感性的认识,激发学生的学习兴趣和热情。这时需要注意在编写C程序过程中的一些特定格式和语法要求,帮助学生养成良好的编程习惯。
(2)基础阶段。这时的学生应该已经学习了算法、变量、表达式、语句、程序结构等C程序基础知识。这一阶段中,我会经常提出一些简单的问题,放手让学生讨论,逐步深入理解问题,逐步完善流程图,然后把流程图翻译成标准的C程序,并进行试运行和调试。
这一阶段中,可以以教材为线索,扩展介绍C语言的语法知识,但不能停留在语法上,可以根据任务和项目的需要插入介绍一些系统函数,并适时地将所学知识应用到项目和任务当中,让学生学以致用。
(3)综合阶段。为了让学生熟练使用语法知识,还需要布置一些较长的程序让学生阅读分解,尝试修改语句和程序结构。这一阶段中,我会经常提出一些相对复杂的问题,放手让学生讨论,逐步深入理解问题,逐步完善流程图,然后把流程图翻译成标准的C程序,然后对流程图和程序反复并进行修改、运行和调试。
这一阶段中,要鼓励学生大胆创新,创造性的运用书上的知识。同时,和学生强调编程的功夫在编程之外,养成学生良好的编程习惯,为学生以后的发展打下基础。
(4)提升阶段。我会根据不同层次的学生提出不同的设计要求,因材施教,尽量使每一个学生都能将所学到的程序设计方法和相关语法综合应用。同时,告诉学生,要达到能用C语言编写较大的应用程序,并不是仅在一个学期的学习过程中就能完成的,在以后的实践中,要继续学习。
在C语言的教学中,采用适度灵活的教学方法,理论讲授和上机实践紧密结合,语法与实例紧密结合,可以激发学生的学习兴趣,增强学生的求知欲,降低课程难度,会达到良好的教学效果。当然,具体教学方式、方法的选择,不同的老师可以根据实际需要而定。
参考文献
[1] 范华,秦茂玲,张俊.透视C程序设计语言[J].计算机技术与发展,2008,18(6):64 -661
[2] 谭浩强.C程序设计[M].第3版1北京:清华大学出版社,2005.
[3] Kernighan B W,Ritchie D M.C程序设计语言[M].第2版.徐宝文,等译.北京:机械工业出版社,2005.
[4] Reek KA.POINTERS ONC[M].徐 波,译.北京:人民邮电出版社,2003.