指针算法算法分析
摘要: 是C 语言教学中非常难解的一个知识模块,文章从C 语言指针算法的概念出发, 分析了指针算法教学中的几个关键点问题, 对在教学中存在的一些问题进行探讨。
关键词: C 语言 教学要点 指针算法 数组
引言
C语言是目前世界上使用最为广泛的计算机语言之一, 目前已经成为各大高校主要的计算机教学语言。指针算法是C 语言中的一个非常重要的概念, 由于指针算法概念比较复杂, 运用非常灵活, 比较难掌握, 尤其是对初次涉及计算机语言的学生来说更是如此。本文重点分析C 语言指针算法单元教学中的几个关键点, 并探讨C 语言教学中应该注意的一些问题。
1 指针算法知识单元构成
1.1 指针算法定义
在计算机内存中, 每一个存储单元(通常为1字节)都有一个固定的编号, 就像酒店中的房间号码一样, 这个编号就称为地址, 如图1 所示。变量P 和x 的地址分别是3610 和2000, 相当于房间号。在地址所标识的内存单元中存放数据, 如在变量x 的单元中存放一个数9, 这就相当于酒店中各个房间里居住的旅客一样代写论文。
图1 指针算法变量
1.2 引用指针算法变量
&和* 是C 语言有关指针算法的两个重要运算符, 分别是取地址运算符和指针算法运算符。例如:&x为变量x 的地址, *p 为指针算法变量p 所指向的存储单元。应该注意的是在定义时* 只起说明作用, 不是运算符。比如下面的语句中: float x= 1.5 float*P= &x float *P= x 很多同学在这里有些迷惑,到底是第2 条语句正确还是第3 条语句正确呢?根据指针算法的定义很显然第2 条语句是正确的。迷惑的原因就在把* 当成了运算符。其实, 这里的float * 共同来修饰P, 定义一个指向浮点型的指针算法变量, 同时要将一个指针算法&x 赋值给P。
为了方便对存储单元进行控制, 我们可以设置某些变量专门存放指针算法,这样的变量称为指针算法变量。图1 中的变量P 存放了变量x 的地址2000,因此, P 就是指向a 的指针算法变量。在课堂教学中,应注意使学生明白内存单元地址与内存单元内容这两个概念的区别, 很多初学者在这个概念问题上常常弄混淆。
1.3 指针算法与数组
1.3.1 指针算法与数组区别。在C语言中数组与指针算法的关系非常密切, 但它们还是有着本质上的区别。指针算法可以随时指向任意类型的内存单元, 它的特征是可变。所以我们常用指针算法来操作动态内存。当数组作为函数的参数进行传递时, 该数组自动退化为同类型的指针算法。例如: char x []=chinachar *p=china 上述两个变量的内存布局情况是: 数组x 需要在内存中占用6 个字节的空间。这段内存区通过数组名x 来标志。指针算法P 则需要4个字节的空间来存放地址, 这4 个字节用P 来标志。其中存放的地址几乎可以指向任何地方,也可以哪里都不指。目前这个P 指向某地连续的6 个字节即字符串china。在教学过程中应该注意使学生能够正确认识数组与指针算法的区别, 并正确运用它们。
1.3.2 数组指针算法。数组指针算法的实质是指针算法, 其定义为: int (*p)[n] 表示P 为指向由n 个元素组成的一维数组的指针算法变量。假设对于一个二维数组a [2][3], 定义一个指向它的数组指针算法P, 程序如下:int a [2][3]={{l, 2, 3}, {4, 5, 6}}int(*p)[3]P=aprintf(%d,(*p)[1])p++printf(%d,(*p)[1])在该程序中, 初始化数组指针算法P 指向数组a的首地址, 即指向二维数组的首行, 此时, 输出这一行的第1 个元素, 即(*p)[1]=2 接着, P 往下移动一个数组的宽度, 即指向二维数组的第二行, 输出这一行的第1 个元素, 即(*p)[1]=5。其存储结构如
2 教学中应注意的问题在C 语言教学中指针算法是难点, 难就难在指针算法概念抽象, 运用灵活。在教学实践中, 对于指针算法的知识单元, 应注重教会学生把握指针算法实质, 对指针算法定义、指针算法数组、数组指针算法、指向指针算法的指针算法等概念要非常熟悉, 教会学生使用图表等方法把指针算法的指向和移动情况真实的描绘出来, 这样能够更清楚的把握指针算法指向的内存单元。同时, 应教会学生区分指针算法数组、数组指针算法、指向指针算法的不同使用场合。数组指针算法适用于列宽确定, 行需要动态生成的场合。指针算法数组适用于行数确定, 列需要动态生成的场合。指向指针算法的指针算法适用于行列均需要动态生成的场合。这些都应该在教学中向学生讲解清楚, 使学生能够正确运用指针算法的各个概念, 掌握指针算法的程序设计。对指针算法单元来说, 教学中还应该注意指针算法作为函数参数、函数与指针算法、指针算法运算等相关知识点的讲解, 这些都是指针算法单元的重要组成部分。
图1 所示:
图2 数组指针算法与二维数组
1.3.3 指针算法数组。指针算法数组的实质是数组, 其定义为: int*p[n] 表示数组P 由n 个指向整型数据的指针算法元素组成。指针算法数组中的每一个元素都相当于一个指针算法变量, 它的值都是地址。用指针算法数组来处理不定长的字符串很方便, 例如有几个姓名字符串需要存储在数组中, 若用一个二维数组来存储, 由于不知道每个字符串长度, 只能留出尽可能多的空间, 这样往往会浪费很多内存空问, 而且对字符串的排序等操作也很麻烦。用指针算法数组来定义时, 就不必了解每个字符串的长度, 只要用指针算法数组中的元素分别指向它们, 不浪费内存空问,而且对字符串排序时, 不必改动字符串的位置, 只需改变指针算法的指向, 从而大大提高程序的效率。这个知识点在教学中应注意使学生区分指针算法数组和数组指针算法两个概念。尤其在定义时要注意书写规范, 不能把指针算法数组与数组指针算法的定义混淆。
1.3.4 指向指针算法的指针算法。指向指针算法的指针算法变量的一个定义形式为:char **p 表示指针算法变量P 指向字符指针算法变量, 或者说P 所指向的是一个地址。这个地址指向一个字符变量。指向指针算法的指针算法经常用来进行文本的存储, 文本的主要特征是具有很强的动态性, 一行文本的字符个数或多或少不确定, 整个文本所拥有的文本行数也是不确定的。这样的特征决定了用固定的二维数组存放文本行必然有许多限制, 缺乏灵活性。这种场合, 使用指向指针算法的指针算法有很大的优越性。
4 结束语
C语言中指针算法的单元内较丰富, 对于很多初学者来说往往很难在短时间内全部掌握。在教学过程中, 教师应尽量多给学生演示指针算法程序, 配合一些图表, 把指针算法的移动和变化过程完整清晰的表达出来。不宜只让学生死记一些杂乱、分散的细节。
参考文献
[1]谭浩强.C 程序设计[M].北京: 清华大学出版社,2005.
[2]张毅坤.C 语言程序设计教程[M].西安: 西安交通大学出版社, 2003.
[3]张健.C 语言教学中的方法与问题解析[J].辽宁师专学报, 2006.3( 8) : 27- 28.作者简介: 徐兵( 1979, 12~) 男, 汉族, 江苏南京人, 硕士, 研究方向:GIS, 软件工程。