开门见山与循序渐进-一种c语言指针教学方法_第1页
开门见山与循序渐进-一种c语言指针教学方法_第2页
开门见山与循序渐进-一种c语言指针教学方法_第3页
开门见山与循序渐进-一种c语言指针教学方法_第4页
开门见山与循序渐进-一种c语言指针教学方法_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-精选财经经济类资料- -最新财经经济资料-感谢阅读- 1 开门见山与循序渐进:一种 C 语言指 针教学方法 (北京交通大学 计算机与信息 技术学院,北京 100044) 中国论文网 /8/view-12921289.htm 摘 要:指针是 C 语言教学中的 难点和重点,作者提出一种指针教学方 法,即把指针的内容贯穿于 C 语言的整 个教学过程中:在第一次课中会介绍存 储器和地址的概念,在随后的教学中, 从存储器和地址的角度解释所学内容, 在指针教学章节重点介绍指针用法。 关键词: C 语言;C 程序设计; 指针;教W 1 背 景 指针是 C 语言的精髓和灵魂,是 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 2 C 语言中最具魅力和最富活力的部分, C 语言通过指针来实现访问硬件资源、 动态分配和回收内存空间、降低函数调 用中参数传递的开销、减少使用全局变 量、实现函数回调等功能。没有指针的 C 语言不可能进行任何有实际意义的编 程。 指针也是 C 语言中最危险的部分, 程序会因指针使用不当而潜藏风险,轻 则导致程序退出,重则导致系统内存泄 漏,甚至系统崩溃。 使用 C 语言编程离不开指针,但 掌握和熟练使用指针却很难,对初学者 尤其如此。指针是 C 语言教学中的难点 和重点,很多教师在教学中尝试了多种 方法1-5 ,取得了不错的效果。作者经 过多年 C 语言教学实践,逐渐摸索出 “开门见山”与“循序渐进”相结合的指针 教学方法,把指针教学融合在 C 语言教 学的全过程中。 “开门见山 ”是在课程开 始,通过介绍计算机体系架构和程序运 行过程,引入存储器及地址概念,尽早 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 3 引入指针;“ 循序渐进” 是在之后课堂教 学内容的设计中,不断介绍和强化存储 器的概念,加强学生对地址的认识。在 正式介绍指针教学内容前,这种教学方 法使学生已经建立并熟悉指针概念,对 掌握和使用指针编程很有帮助。 2 指针学习困难的原因 学生在指针学习时,普遍感觉指 针概念抽象,难以理解,影响学习、掌 握和使用。主要原因在于如下 3 点。 (1)对学生而言,程序设计是 一门全新类型的课程。其特点是知识点 分散、逻辑性不强。编写代码既要符合 语法规则,又要考虑逻辑关系,编码必 须严格遵守语法规则:一个看上去微不 足道的错误,比如语句漏写了分号,编 译器会在其他没有错误的地方报告很多 错误信息,这使初学者手足无措,无法 排错;程序有了致命错误,比如变量没 有初始化,但编译器只会轻描淡写地报 个告警(warning ) ,程序运行时,却时 对时错。这些特征对于初学者都是陌生 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 4 的,他们以往的学习方法和经验在面对 该课程时几乎没有任何借鉴作用,这导 致他们从课程开始就遇到很多困难。 (2)学生们不了解计算机。C 语言是伴随着 UNIX 操作系统产生的, 它的语言特性和计算机的构成紧密结合, 甚至可以说,C 语言是为对计算机了如 指掌的专家设计的。而大学中常把 C 语 言课程安排为程序设计的常识教育,学 生在学习 C 程序设计课程前,还没有学 过计算机原理等课程,他们可能听说过 CPU、内存等概念,但并不了解这些概 念的确切含义,不了解程序运行的过程, 这会导致指针概念更加抽象,难以理解、 掌握并使用。 (3)学生们通常是在学习 C 语 言遇到困难挫折的情况下,接触和学习 指针的,这增加了他们的畏惧心理,影 响指针内容的掌握。基于兴趣,在课程 开始阶段他们专心听讲,努力编写和调 试简单的程序,但随着变量、函数、数 组等内容逐渐引入,程序结构越发复杂, -精选财经经济类资料- -最新财经经济资料-感谢阅读- 5 程序设计需要同时考虑算法,这会使学 生感觉到学习的压力和困难,特别是在 编译程序时,排除一个小小的错误,都 要耗费很长的时间,这严重影响他们的 学习热情和信心。在这种情况下,指针 被引入课程中,并且指针概念抽象,又 和 C 中的变量、函数、数组、结构等联 系紧密,这些都放大了指针的学习难度, 影响学生的理解和掌握。 针对如上问题,作者逐渐探索并 使用了“开门见山 ”与“循序渐进”相结合 的教学方法。 3 开门见山 所谓开门见山,指在第一次课就 介绍存储器和地址的概念。在介绍 “Hello world”之后,即介绍计算机的结 构、存储器和地址的概念,随后介绍 “第二个程序 ”以加深这些概念的理解。 3.1 计算机结构与存储器 初学者通过“Hello world”了解了 C 语言的代码风格、集成开发环境和程 序编译、链接、执行的过程,随后介绍 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 6 计算机的“冯 诺依曼” 结构,向学生说 明程序在计算机内的运行过程。课堂主 要介绍如下几个方面知识。 (1)计算机构成及程序运行的 方法。如图 1 所示,其中外存储器指硬 盘,操作系统、应用程序和数据都以文 件形式保存在硬盘上,内存储器保存正 在运行的程序和程序所要操作的数据, 这些程序是由操作系统从硬盘上装入到 内存储器的。CPU(运算器、控制器) 用于运行程序,CPU 从程序所在的存储 器起始位置开始,依次读取指令并执行, 直到程序结束。 (2)内存储器是由 N 个连续的 存储单元组成的,每个单元可以存储 8 比特二进制数(称为一个字节) ;N 称 为内存容量。计算机为每个存储单元分 配唯一的编号,从 0 开始编起,直到 N-1,这个编号称为该存储单元的“地址” ,CPU 使用编号(地址)访问这些存储 单元。 (3)内存储器中存储的既有代 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 7 码,也有数据;构成程序的代码依次存 储在内存储器中;程序要操作的数据也 保存在内存储器中。 3.2 第二个程序 第二个程序展示计算机的计算功 能,该程序引入了变量及数据类型概念, 存储器和地址在程序代码中首次出现。 代码如上图所示。 介绍程序强调如下几个方面的知 识。 (1)计算机要计算两个整数的 和,首先需要找两个地方来保存这两个 整数,这两个地方就位于内存中; (2)计算机在内存中为不同类 型的数据分配大小不同的存储空间, “int a,b,r;”要求计算机分配三块内存空 间,分别用变量“a,b,r” 表示,每块内 存空间存储一个整数,变量的值改变, 表示其所代表的存储空间存储的内容发 生了改变。 (3)scanf(“%d, %d”, &a, &b)表示从标准输入设备(键盘) -精选财经经济类资料- -最新财经经济资料-感谢阅读- 8 上接收用户输入的两个整数,这两个整 数分别保存在“a,b”所代表的内存中, 内存用地址表示, “&a,&b”分别表示取 “a,b”的地址, “%d”表示每个空间要保 存的数的数据类型为整数,这确定了每 个空间占据的字节个数。 (4) scanf()实现的功能是通过很多条计算 机代码实现的,这些代码在程序被装入 内存时,也被装入了内存。CPU 执行函 数就是从这个函数的起始代码开始顺序 执行。函数名 scanf 就是起始代码在内 存中的地址,即:函数名表示的是函数 代码块在内存中的开始地址。 通过第二个函数,初步介绍了数 据类型、变量、函数的概念,并从存储 器的角度来认识这些概念,把概念和地 址结合在一起,使 3.1 中介绍的存储器 概念具体化,加强对存储器及地址的认 识,在之后每次使用 scanf()时,都 会强调变量、空间、地址的对应关系, 使学生熟知这些知识。 4 循序渐进 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 9 循序渐进是指初学者初步接触存 储器和地址的概念之后,课程会继续从 存储器和地址的角度解释所学内容,以 加强这些概念及用法。以函数、数组、 指针、结构为例说明。 4.1 函 数 C 语言函数采用传值调用,在函 数中修改形参的值,不会改变实参的值, 如上图所示。 程序输出为:“a=10, b=20”。 在解释上述结果时,不仅要强调语法规 则:“函数内不能改变函数外变量的值” , 还要从存储器的角度解释。如图 2,main()函数中两个变量“a,b” (比如占据空间从 0x01001000 开始) 和 swap()函数中两个变量“a,b”(比 如占据空间从 0x01001100 开始)使用 不同的存储空间,swap()函数中变量 “a,b”的值修改,改变的是 0x01001100 开始的地址空间的值,但没有修改 main()函数中变量“a,b”所代表的存 储空间的值,因此 main()中“a,b”的 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 10 值不会改变。 4.2 数 组 数组是 C 语言的重要内容,也是 C 语言的难点之一,在指针章节开始之 前,数组是和存储器及地址概念结合最 紧密的内容,因此在数组部分会更多强 调指针的内容。在介绍数组概念及例子 中,主要介绍如下知识。 (1)数组是由很多相同类型的 变量组成的集合,C 语言通过下标改变 的方式,来表示数组中的这些变量,为 写查找和排序算法提供了方便。 (2)数组中每个变量在存储器 中要占据一块存储空间,这些变量所占 据的存储空间是连续的。比如数组 float aN(N 为常量)表示在计算机内存中 的一块连续的存储器空间,空间大小为: N * sizeof(float)字节。 (3)数组名字 a 是这块存储空 间的开始地址。a0表示这 N 个变量中 的第一个变量,a 和&a0相等,ai的 地址和 a+i*sizeof(float)相等。 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 11 (4)计算机的存储器是有限的, 连续的空闲存储空间更有限,因此数组 中变量的个数 N 是有限的。 (5)下标 i 的取值范围为 0N- 1,但如果代码中出现对不属于数组的 空间进行读操作,比如“float b=aN+1”, 程序可能仍可以运行;如果代码中出现 对不属于数组的空间进行写操作,比如 “aN+1 = 11.23”,程序可能可以正常运 行,但通常会立即崩溃。因此,通过下 标访问不属于程序的空间是不安全的, 编程中要严格禁止。 (6)若函数的参数定义为数组, 则函数对形参数组内变量修改,会同时 改变实参数组变量的值,这是因为函数 的形参数组是地址,实参和形参表示的 是同一地址空间,内部对形参数组的访 问,就是对实参表示空间的访问。 通过数组,进一步建立变量和存 储空间(连续存储空间) 、地址的关系, 为指针学习进一步建立基础。 4.3 指 针 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 12 经过不断重复、铺垫,在指针教 学开始时,学生已经熟悉了地址的概念, 也更容易理解指针,之后的学习重点在 于指针的用法,并逐渐习惯使用指针编 程。 指针部分的主要内容包括:第一, 指向变量的指针及其在函数参数传递中 的作用,函数的形参定义为指针,可以 在函数内部改变函数外部变量的值,实 现地址调用;第二,指针与数组的关系, 引入动态内存分配,学习 C 语言的存储 器管理技术;第三,指向函数的指针, 在指针指向的存储空间中,存储的是函 数的代码,函数名字就是该存储空间的 开始地址,初步介绍回调函数的概念; 第四,指针数组的定义和使用,支持行 和列都可变的二维数组定义及用法。 4.4 结 构 结构内容放在指针内容之后介绍, 主要是因为指针可以是结构的成员变量, 如果结构中指针变量指向的数据类型和 结构相同,则可以生成链表。 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 13 介绍结构要和存储空间以及指针 的概念紧密结合。定义结构时,要同时 强调该结构类型变量所占据的存储空间, 如以上结构定义图。结构变量的存储结 构如图 3 所示,从中可以看到:结构 型变量中的变量,在存储器中的存储顺 序和结构中变量定义的顺序相同;基 本变量、数组等占据的空间和其单独定 义时占据的空间可能不同,与编译选项 有关(是否设置了对齐要求) ;指针 变量(pNext )占据的空间大小固定, 与指针所指向的数据类型没有关系。 结构定义是否合法,主要看是否 能够计算出结构变量所占据的存储器空 间。结构里面不能声明同一个结类 型的变量,该递归定义会导致结构变量 所占据的空间无穷大,但可以定义指向 该结构类型的指针,因为指针大小固定。 结构变量和普通变量一样,变量 赋值操作本质上是存储器复制。比如: Student a, b; a=b;是把 b 变量所占 -精选财经经济类资料- -最新财经经济资料-感谢阅读- 14 据的存储空间的内容,全部复制到 a 变 量所占据的存储空间中。如果结构中定 义了数组,则实现了数组的赋值操作, 而数组自己是不支持赋值操作的。但对 于指针变量的复制,会导致 a.pNext 和 b.pNext 相等,这却不是程序员想要的 结果,需要特别关注。 5 结 语 C 程序设计语言离不开指针,学 习和掌握指针用法又非常艰难

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论