1、-128-提前介入法在 C 语言指针教学中的应用 陈冰川 (广东财经大学,广东 广州 510320)【摘 要】C 语言程序设计是所有计算机及其相关专业课程中的一门重要基础课,而指针又是该课程的重点及难点,也是其他语言中理解引用型变量的基础。文章分析了指针成为课程难点的原因,并在教学中采用了提前介入法,在整个教学过程中,提前将与指针有关的知识有机地融入到不同章节,使学生在整个学习过程中逐步深化指针的概念,并了解其特点和作用,最终在指针一章时再进行梳理总结。通过教学实践发现,教学中采用提前介入法,使学生对于指针的理解和掌握程度得到提升,起到了较好的实践效果。【关键词】C 语言;指针;编程语言教学【
2、中图分类号】G642 【文献标识码】A 【文章编号】1008-1151(2022)12-0128-03 Application of Advance Intervention Method in C Language Pointer Teaching Abstract:C programming language is an important basic course in all computer science and related professional courses,and the pointer is the keynote and difficulty of this co
3、urse,and it is also the basis for understanding referential variables in other languages.This paper analyzes the reasons why the pointer has become a difficult point of the course,and adopts the advance intervention method in teaching.In the whole teaching process,organically integrate the knowledge
4、 related to the pointer into different chapters in advance,so that in the whole learning process students can gradually know the concept of the pointer,understand its characteristics and functions,and finally comb and summarize when teaching the chapter of the pointer.Through the teaching practice,i
5、t is found that the advance intervention method in teaching has improved the students understanding and mastery of the pointer,and has played a good practical effect.Key words:C language;pointer;programming language teaching 引言 C 语言程序设计在计算机程序设计语言中占有重要的一席之地,它以语法简洁紧凑、程序精炼、运算符和数据结构丰富、编程灵活、可移植性好而著称1。而指针
6、是其精髓和灵魂,是 C 语言中最具魅力和最富活力的部分2,同时也是公认的教学难点3。C 语言通过指针来实现访问硬件资源、动态分配和回收内存空间、降低函数调用中参数传递的开销、减少使用全局变量、实现函数回调等功能。没有指针的 C 语言不可能进行任何有实际意义的编程2。而且指针的思想并不是只在 C 语言中有意义,在 JAVA、Python 等语言中虽然取消了指针,但是其“引用型”变量的很多性质和应用与指针变量非常相似,掌握好了指针的概念,对于后续其他语言的学习同样具有重要意义。但是在实际教学实践中发现,高校学生尤其是低年级学生或是非计算机类学生,在对计算机相关基础没有了解的情况下,对于指针的理解和
7、使用是具有一定困难的,因此有必要采取措施对指针的教学进行改进,提升学生对其的理解与掌握程度。按照目前的教学规律,指针内容往往是放在比较靠后的阶段进行介绍的,由于前面如数据存储方式、变量、数组、函数等内容并不涉及指针,后面章节再谈起指针,会使学生产生知识认知上的错位和断层。如果在讲授以上内容时,提前加入与指针相关的概念,到了指针一章时将会使学生作为一个体系去理解,接受度将会大为提高。基于以上目的,笔者结合自身学习和教学的经验提出了提前介入的教学方法,用于在 C 语言程序设计教学中,即在C 语言教学过程中,每一章根据其特点,从不同侧面适当地引入指针的概念、使用方式和基本原理。该方法已经应用于实践并
8、取得了较好的成果。1 提前介入法的基本思想 笔者教学使用的教材为清华大学出版社出版,由谭浩强主编的C 语言程序设计(第三版),根据教材的章节特点逐步引入指针的定义、内存存储方式、基本原理、使用方法等。由于指针相关知识为教材一章的内容,如果在某节课涉及过多,会导致无法按时完成教学任务,也会为学生的学习总第 24 卷 280 期 大 众 科 技 Vol.24 No.12 2022 年 12 月 Popular Science&Technology December 2022 【收稿日期】2022-10-10【基金项目】广东省教育厅特色项目(2017KTSCX074)。【作者简介】陈冰川(1975)
9、,男,四川达州人,广东财经大学讲师,研究方向为软件工程、人工智能。-129-带来负担,因此在每章提前介入指针概念时,基本原则是:适当涉及、点到即止、不求全懂、只留印象。提前介入的方法主要目的是让学生在正式进行指针一章的学习时,对于指针已经有一个初步的认识,并且了解了指针引入的目的,能够带来的好处,它和变量、变量地址之间的关系等。到了正式进行指针一章的讲授时,学生就能够比较自然地掌握和了解指针的特点和用法。2 按章节提前介入指针的具体方法 本文以谭浩强主编的清华出版社出版的C 语言程序设计(第 3 版)为基础,分别以数据的存储与运算、顺序结构、利用数组处理批量数据和函数实现模块化程序设计四章为基
10、础,介绍如何在这些章节中引入指针的概念以及讲授的重点。2.1 在“数据的存储与运算”中引入指针在“数据的存储与运算”中引入指针 本章的主要内容是介绍数据在内存中如何存储,以及按照不同数据类型(包括整型、实型和字符型)介绍变量、常量的不同存储方式和表现形式,最后介绍算数表达式和相关的 C 语言表达式。本章关键是对于变量和常量的理解和掌握,而指针对于变量的存储模式具有促进作用,因此本章可自然地引入指针和指针变量的概念。首先,在本章第一节“数据在计算机中是怎样存储的”中,强化计算机按字节存储,字节的编号就是地址,地址能够指出数据存储的位置便于查找,由此可引出地址还叫做“指针”,让学生对于内存存储有一
11、个初步概念,了解到通过地址或指针就可以找到要存储(读取)数据的位置。然后,在本章第二节“整型数据的运算与分析”中,介绍什么是变量时将变量名、变量地址、存储单元和变量值,通过校园的某栋楼的名称(如:第一教学楼)、所在校内地址(如某区某栋)、大楼本身和楼内的学生分别做一一对应,深化学生对于变量名、变量地址的理解。在此基础上,讲授赋值的过程,即编译系统根据变量名所代表的地址,找到存储单元,将所赋之值存入。(1)引导学生思考,如果定义了一个整型变量 x 其对应的地址为 100000,还有另外一个变量 p(此处忽略如何定义)保存了变量 x 的地址 100000,请学生设想如果想给 100000 的地址对
12、应的存储单元中存储一个整型常量 10,如何处理。(2)进一步引导学生了解可以通过 x=10 进行赋值,即告诉系统将 10 存储到变量 x 对应的地址中。(3)再进一步提示学生 p 也存储了 x 的地址,如何告知系统将 10 存储到 p 所保存的地址对应的存储空间呢?注意p=10 是错误的,按照 x=10 的处理规则会发现这样的语句只会将 10 存储到 p 对应的地址(而不是存储的地址)中。(4)最后告诉学生,c 语言通过符号“*p”来代表访问p 保存的地址空间,而变量 p 就像一个“指针”指向了 x 对应的内存空间,因此 p 就是后面将要学习到的“指针变量”即:用来存储指针(地址)的变量。如果
13、想要将 x 的地址赋值到 p变量中,由于编程期间是无法了解该变量在运行时被分配的地址,不能直接给 p 赋值 100000,只能通过 p=&x 的方法赋值,进而介绍取地址的符号。到此基本将指针和指针变量,以及它的作用讲清楚了。但是由于不是系统地进行讲授,为了保证学生学习的完整性,此处一般会强调并总结,无论学生听懂与否,都没有关系,只要了解了地址还叫指针,用来存储地址的变量就叫做指针变量即可,以后还会继续涉及相关内容。2.2 在“顺序结构”中引入指针在“顺序结构”中引入指针 本章主要介绍算法和最基本的编程结构顺序结构,同时介绍了赋值语句和输入输出语句。因此本章将会在讲授赋值语句和格式输入输出语句时
14、提前介入指针的相关概念。(1)赋值语句。在赋值语句的讲授过程中,在讲授了赋值语句的预算顺序以及作用后,可再次向学生提示,当一个整型变量 x 在赋值号左右两边所代表的含义之间的细微区别:在左边表示将赋值号右面的表达式的值赋值到x所代表的内存存储空间中,而在右边则表示将 x 所代表的的内存储空间的值赋值到赋值号左边的变量中。一个表示 x 对应的存储空间,另一个表示 x对应的存储空间的值。在这样的解释前提下再次提出上一章提及的指针内容:请学生思考:如果有一个变量 p 用来存储 x 的地址,如果想向 x 赋值 10,如果允许表达式 p=10 在 c 语言中运行,会带来什么结果?能否达到向 x 所代表的
15、地址的存储空间写入 10?告诉学生按照赋值语句的赋值规则,上述结果只会给 p对应的存储空间赋值 10,而不会赋值到 x 对应的存储空间中,因此需要使用“*p=10”的方法进行赋值。此处再次提醒学生对于指针的含义以及*p 的含义。通过以上的讲授既让学生进一步了解赋值语句的作用,也使学生对于指针的操作与应用有了进一步的认识。(2)格式输入输出语句。在格式输入输出函数的讲授中,最容易出错的就是在scanf 函数中变量参数要加取地址的符号&,此处可以再次引入指针相关的介绍。相关讲解内容如下:讲授 scanf(“%d”,&x)函数的作用,是将输入的整型值存储到 x 对应地址的存储单元中。简单告知学生当变
16、量作为函数参数时相当于把变量值传入函数,并未传入具体地址,从而导致函数无法获取变量的值。为了能够将地址传入函数,则需要提供一个操作符用于返回变量的地址,c 语言用“&”表示取地址的操作。在上机实验课时,可以让学生通过输出语句输出 x 的值和&x 的值,同时指导学生如何通过开发环境查看变量所在的内存,以及存储的数据。通过上述内容的讲述,既使学生了解了输出函数的本质和变量在内存中存储的方式,还能够进一步了解去地址符号的作用,训练了学生上机调试代码的能力。2.3 在“利用数组处理批量数据”中引入指针在“利用数组处理批量数据”中引入指针 由于选择结构和循环结构两章主要是介绍程序结构,与-130-内存存
17、储和变量关系不大,这两章不再引入指针相关知识,将学生的精力全部放到这两章容易错误的知识点上,如逻辑表达式的运算,循环的边界条件等。而到了本章主要介绍数组时,就可以再次将指针相关的知识介入,加深学生的理解。本章主要从数组的定义,以及内存存储方式进行指针相关知识的介入。(1)一维数组定义。在讲授到一维数组定义时,在讲解了一维数组的定义后编译系统会根据定义的数组长度在内存中申请连续的相应大小的空间后,再次讲解指针的概念。首先让学生理解地址的概念,其实就是一块连续存储空间的首地址,其他地址根据数组的类型,依次获取相关元素。进而让学生考虑对于单个变量的情况,当变量为整型为 4个字节时,所谓的变量地址其实
18、也是类似的为这四个连续存储空间的首地址,程序在读取数据时是根据首地址依次读取四个字节的内容,获取变量的值。强调每一个数组元素都可以当做一个变量看待,即都对应了相应的内存单元,用整型数组举例。例如:int a10;假设整型占有 4 个字节,让学生自己推算第 i 个元素的地址,即第 i 个元素的地址其实是 a+4i。上机时通过内存查看和通过语句:printf(“%d”,&ai);查看数组每一个变量的地址的方式,加深数组元素地址的印象。介绍数组名代表了数组的首地址,同时扩展告诉学生,这里的数组名是一个指针常量,引导学生回忆常量本身是不可以被赋值的。再次提前讲指针变量 p 是可以被赋值的例如 int
19、x;p=&x;或者 int a10;p=a;第一个赋值表示将 x 的地址存入指针变量 p 中,而第二个赋值表示将数组 a 的首地址存入指针变量 p 中。此处的表达方式再次说明 a 本身就是一个指针,所以赋值时无需增加取地址符号“&”。再次提醒学生由于 p 是指针变量可以被赋值,而数组名 a 是指针常量,不可以被赋值,即以下代码是错误的:int a10,b10;a=b;/a 是指针常量不可以被赋值 告诉学生以下赋值都是正确的,并且 p 与 q 的值是相同的,进一步让学生了解数组名就是数组的首地址,即:假设 p 和 q 都是指针变量,int a10;p=a;q=&a0;此处不可过于延展,否则将会使
20、学生陷入过深,忽略了本章的重要内容。至此不仅使学生了解到了数组名指向数组的首地址,也再次回忆了变量与常量的区别,同时涉及了第八章指针部分的指向数组的指针的内容。(2)二维数组的定义。在二维数组的讲授中,关键要突出每一维的含义,以及各自代表的意义。具体讲授内容如下:讲授逻辑上大家认为的二维数组就是一个二维表,而实际内存存储只是简单的连续空间的存储。例如,int a23逻辑存储是 2 行 3 列,而实际存储就 6 个连续的内存空间,同样让学生自己推出每个元素地址的计算公式:a+4*2i+4j。上机实验课通过内存查看进一步理解二维数组的存储模式。让学生考虑 a,a0和&a00之间的关系,都是指向首地
21、址,此处不宜多讲,因为涉及指针变量加一的值相对难懂,为了防止学生陷入过深,此处提到即可。通过此章关于指针相关的内容的提前讲授,让学生对于指针在数组中的应用有了一个初步认识,为第八章数组与指针一节做好铺垫。2.4 在“函数实现模块化程序设计”中引入指针在“函数实现模块化程序设计”中引入指针 本章主要是介绍 C 语言的函数的定义、声明和使用,并通过变量的周期和生存期说明变量在函数中的特性。结合本章内容,可以简要地讲解指针作为函数参数的内容。(1)函数的定义,在本节中主要提示学生代码要运行同样需要载入内存,也同样要有地址,而函数名实际上就是函数指令存储的首地址也叫“函数入口”。(2)函数的嵌套调用,
22、本节主要通过板书将每个函数画作一个独立的空间,当该函数被调用时,动态地在其空间内将函数中的变量,以及形参申请空间,并重点说明将实参的值赋值到形参对应的空间中。当该函数调用结束后,直接擦除刚刚申请的变量,直观地让学生体会到,函数内部的变量的值除了通过 return 语句,无法被传递至函数之外;也认识到函数参数之间是通过值传递,而无法通过在函数内改变实参的值。(3)数组作为函数参数,主要讲解数组名作为参数,数组名与变量名的关系。让学生回忆一个函数如何返回一个值,并让学生思考如果有多个值需要返回需要如何处理?进而告知 C 语言中有几种返回方式,一是接下来要学习的多个全局变量可以把函数中的若干值返回;
23、第二是后面章节要学的通过返回结构体返回多个值;最后是通过指针将地址告诉函数,将结果直接存储在相应内存中,从而起到返回若干值的效果。理解函数形参 test(int a10)和调用函数中数组定义int a10样子一样,但是意义完全不同,作为形参的类似数组定义的 a 实际上是一个指针变量,说明是一个指向由 10 个元素组成的整型数组的首地址的指针变量,而在调用程序中定义的则是一个指针常量指代数组的首地址,通过值传递将常量的值传给了指针变量。此处点到即止不宜讲得过深,由于并未系统地进行讲授,过于深入容易让学生混乱,只需了解到它们是有区别的即可。进一步解释为什么通过数组名作为函数的参数可以将值带出函数(
24、本节前已经让学生了解了函数内部的值是不能被函数以外的代码访问的)。由于数组名代表了数组所在的地址(如所述),而函数用数组名作为参数,也就是在函数中指明了值需要保存的位置,直接将数值保存至函数之外了。通过上述的讲解让学生进一步了解了指针在函数参数中所起的作用,并加深了为什么函数无法改变实参的值的原理。对于第八章讲解“指针变量作为函数参数”一节打下铺垫。(下转第 106 页)-106-期留置气管导管患者首选的气管插管方式,特别在特殊患者(如凝血功能障碍)有效地减少鼻腔、咽喉部、气道损失,被插管患者自觉舒适度较经口腔气管插管术好,利于后期气道管理、口腔护理、生活护理等。在紧急情况下行经鼻腔由支气管镜
25、引导下行气管插管术,术前进行评估鼻腔、鼻道情况,用呋嘛滴鼻液收缩鼻甲扩大鼻道,2%利多卡因局部浸润麻醉减少患者痛苦,减少鼻腔黏膜损伤、出血,增加患者舒适度,是成功进行经鼻腔由支气管镜引导下行气管插管术条件之一。气囊固定联合胶布、棉绳三重固定方法是利于气管导管固定,防止气管导管移动或者脱出,防止鼻腔黏膜损害。6 结论 经鼻腔行支气管镜引导下行气管插管术是迅速建立有效、安全的人工气道的方法,是抢救和复苏成功的重要环节。经鼻腔支气管镜引导下气管插管术可迅速连接呼吸机或建议呼吸器辅助呼吸,迅速改善患者肺通气,提高患者的氧分压。在插管过程中,用物的准备、护理的配合尤其重要,是经鼻腔支气管镜引导下行气管插
26、管术插管成功的关键之一,极大地缩短了插管的时间,减少患者痛苦,增加患者舒适度,增加了患者的治疗依从性,患者及家属容易理解和接受,值得在临床工作中推广应用。【参考文献】1 陈丹,黄永康.纤支镜引导下经鼻气管插管综述J.大众科技,2016(4):70-71.2 许庆林,朱宏泉,李葆华.逆行气管插管与经鼻纤维支气管镜引导气管插管的临床比较J.中国全科医学,2011(5):560-561.3 吴振威,倪华栋,姚益冰,等.两步气管插管法的安全性和可行性分析J.全科医学临床与教育,2021(11):989-992.4 廖飞,陈静宜,陈粤丽,等.在电子软镜引导下进行双腔气管插管及定位的可行性J.当代医药论丛
27、,2021(21):94-96.5 陈光菊,谢东武,罗祺,等.临床护理路径在气管镜室插管病人的应用效果分析J.糖尿病天地,2020,17(10),217.6 廖林凤.UE 可视喉镜在 ICU 经鼻气管插管的护理配合研究J.医学食疗与健康,2020,18(24):151-153.7 苏春燕.全麻下视可尼喉镜经鼻气管插管的护理配合J.深圳中西医结合杂志,2020(10):191-192.8 陈丹,李琳,温柳云.尘肺病患者经纤支镜操作检查和治疗中个体化麻醉的临床应用J.华夏医学,2014,27(4):89-92.9 王淑敏,温雅,孟欣荣.丙泊酚配合纤支镜引导经鼻气管插管方法及护理体会J.海峡药学,2
28、017,29(1):168-169.10 王静.纤维支气管镜引导下气管内插管术的护理配合措施研究J.中国保健营养,2017,27(2):248.11 胡丹,陈平.床旁纤支镜引导下经鼻气管插管的护理J.护士进修杂志,2008(11):1049-1050.12 邓芳华.纤维支气管镜引导下气管内插管术的护理配合及临床效果J.家庭保健,2018(18):120.13 翁淑贞,赵丽芬,林晓.可视喉镜引导经口气管插管技术急诊护理教学歌诀J.实用临床护理学电子杂志,2017(45):186.14 李小霞,李玉凤.可视喉镜在急诊气管插管中的应用及护理配合J.当代临床医刊,2019,32(4):371,381.
29、(上接第 130 页)2.5 教学教学小结小结 通过以上课程对于指针的提前介入,根据课程实际内容可以发现对于指针的提前介入不仅可以让学生能够提前接触到指针的概念,便于后续的学习,而且还可以加深对应章节的一些原理的认识,更能够掌握 C 语言的精髓。如果只是在指针一章,再将前面的内容重复补充,很难让学生有一个清楚的认识,因为大学生的学习规律与中学不同,课后复习的习惯在减弱,如果在课堂授课时没有第一时间讲清楚,相当一部分学生将会在后续的学习中淡忘,效果将大打折扣,因此在学习相关知识时应提前提及,在真正学习相关内容时,学生更容易接受和理解。3 结束语 指针作为 C 语言的一个重要特征和精髓,其实贯穿了
30、整个 C 语言的知识之中,如果不提前接触,对于很多原理只能是死记硬背,难以融会贯通,因此本文提出了提前介入法,进行 C 语言中的指针知识点的教学,不仅使学生更深刻地认识到了当前所学知识的原理,也对于后续指针章节的学习有了更深的理解。实践证明(4 个学期以上的实践教学),发现到了指针一章的讲解时,学生的理解和接受程度提高了很多。在以后的教学中,需要再深化此种教学,在不影响当前课程内容理解的同时,更深入地让学生提前了解指针,真正地掌握指针,对于 C 语言的应用更加得心应手,并会进一步研究提前介入法在其他课程和知识讲授中的应用与实践。【参考文献】1 张忆文,C 语言指针教学难点透析J.计算机教育,2017(1):155-161.2 赵帅锋,胡绍海.开门见山与循序渐进:一种 C 语言指针教学方法J.计算机教育,2017(4):112-120 3 王立柱.数据结构与算法M.北京:华章出版社,2013.