• 美文
  • 文章
  • 散文
  • 日记
  • 诗歌
  • 小说
  • 故事
  • 句子
  • 作文
  • 签名
  • 祝福语
  • 情书
  • 范文
  • 读后感
  • 文学百科
  • 当前位置: 柠檬阅读网 > 范文 > 正文

    提前介入法在C语言指针教学中的应用

    时间:2023-03-27 09:05:04 来源:柠檬阅读网 本文已影响 柠檬阅读网手机站

    陈冰川

    提前介入法在C语言指针教学中的应用

    陈冰川

    (广东财经大学,广东 广州 510320)

    C语言程序设计是所有计算机及其相关专业课程中的一门重要基础课,而指针又是该课程的重点及难点,也是其他语言中理解引用型变量的基础。文章分析了指针成为课程难点的原因,并在教学中采用了提前介入法,在整个教学过程中,提前将与指针有关的知识有机地融入到不同章节,使学生在整个学习过程中逐步深化指针的概念,并了解其特点和作用,最终在指针一章时再进行梳理总结。通过教学实践发现,教学中采用提前介入法,使学生对于指针的理解和掌握程度得到提升,起到了较好的实践效果。

    C语言;
    指针;
    编程语言教学

    C 语言程序设计在计算机程序设计语言中占有重要的一席之地,它以语法简洁紧凑、程序精炼、运算符和数据结构丰富、编程灵活、可移植性好而著称[1]。而指针是其精髓和灵魂,是 C 语言中最具魅力和最富活力的部分[2],同时也是公认的教学难点[3]。C 语言通过指针来实现访问硬件资源、动态分配和回收内存空间、降低函数调用中参数传递的开销、减少使用全局变量、实现函数回调等功能。没有指针的 C 语言不可能进行任何有实际意义的编程[2]。而且指针的思想并不是只在C语言中有意义,在JAVA、Python等语言中虽然取消了指针,但是其“引用型”变量的很多性质和应用与指针变量非常相似,掌握好了指针的概念,对于后续其他语言的学习同样具有重要意义。但是在实际教学实践中发现,高校学生尤其是低年级学生或是非计算机类学生,在对计算机相关基础没有了解的情况下,对于指针的理解和使用是具有一定困难的,因此有必要采取措施对指针的教学进行改进,提升学生对其的理解与掌握程度。

    按照目前的教学规律,指针内容往往是放在比较靠后的阶段进行介绍的,由于前面如数据存储方式、变量、数组、函数等内容并不涉及指针,后面章节再谈起指针,会使学生产生知识认知上的错位和断层。如果在讲授以上内容时,提前加入与指针相关的概念,到了指针一章时将会使学生作为一个体系去理解,接受度将会大为提高。

    基于以上目的,笔者结合自身学习和教学的经验提出了提前介入的教学方法,用于在C语言程序设计教学中,即在C语言教学过程中,每一章根据其特点,从不同侧面适当地引入指针的概念、使用方式和基本原理。该方法已经应用于实践并取得了较好的成果。

    笔者教学使用的教材为清华大学出版社出版,由谭浩强主编的《C语言程序设计》(第三版),根据教材的章节特点逐步引入指针的定义、内存存储方式、基本原理、使用方法等。由于指针相关知识为教材一章的内容,如果在某节课涉及过多,会导致无法按时完成教学任务,也会为学生的学习带来负担,因此在每章提前介入指针概念时,基本原则是:适当涉及、点到即止、不求全懂、只留印象。

    提前介入的方法主要目的是让学生在正式进行指针一章的学习时,对于指针已经有一个初步的认识,并且了解了指针引入的目的,能够带来的好处,它和变量、变量地址之间的关系等。到了正式进行指针一章的讲授时,学生就能够比较自然地掌握和了解指针的特点和用法。

    本文以谭浩强主编的清华出版社出版的《C语言程序设计(第3版)》为基础,分别以数据的存储与运算、顺序结构、利用数组处理批量数据和函数实现模块化程序设计四章为基础,介绍如何在这些章节中引入指针的概念以及讲授的重点。

    2.1 在“数据的存储与运算”中引入指针

    本章的主要内容是介绍数据在内存中如何存储,以及按照不同数据类型(包括整型、实型和字符型)介绍变量、常量的不同存储方式和表现形式,最后介绍算数表达式和相关的C语言表达式。本章关键是对于变量和常量的理解和掌握,而指针对于变量的存储模式具有促进作用,因此本章可自然地引入指针和指针变量的概念。

    首先,在本章第一节“数据在计算机中是怎样存储的”中,强化计算机按字节存储,字节的编号就是地址,地址能够指出数据存储的位置便于查找,由此可引出地址还叫做“指针”,让学生对于内存存储有一个初步概念,了解到通过地址或指针就可以找到要存储(读取)数据的位置。

    然后,在本章第二节“整型数据的运算与分析”中,介绍什么是变量时将变量名、变量地址、存储单元和变量值,通过校园的某栋楼的名称(如:第一教学楼)、所在校内地址(如某区某栋)、大楼本身和楼内的学生分别做一一对应,深化学生对于变量名、变量地址的理解。在此基础上,讲授赋值的过程,即编译系统根据变量名所代表的地址,找到存储单元,将所赋之值存入。

    (1)引导学生思考,如果定义了一个整型变量x其对应的地址为100000,还有另外一个变量p(此处忽略如何定义)保存了变量x的地址100000,请学生设想如果想给100000的地址对应的存储单元中存储一个整型常量10,如何处理。

    (2)进一步引导学生了解可以通过x=10进行赋值,即告诉系统将10存储到变量x对应的地址中。

    (3)再进一步提示学生p也存储了x的地址,如何告知系统将10存储到p所保存的地址对应的存储空间呢?注意p=10是错误的,按照x=10的处理规则会发现这样的语句只会将10存储到p对应的地址(而不是存储的地址)中。

    (4)最后告诉学生,c语言通过符号“*p”来代表访问p保存的地址空间,而变量p就像一个“指针”指向了x对应的内存空间,因此p就是后面将要学习到的“指针变量”即:用来存储指针(地址)的变量。如果想要将x的地址赋值到p变量中,由于编程期间是无法了解该变量在运行时被分配的地址,不能直接给p赋值100000,只能通过p=&x的方法赋值,进而介绍取地址的符号。

    到此基本将指针和指针变量,以及它的作用讲清楚了。但是由于不是系统地进行讲授,为了保证学生学习的完整性,此处一般会强调并总结,无论学生听懂与否,都没有关系,只要了解了地址还叫指针,用来存储地址的变量就叫做指针变量即可,以后还会继续涉及相关内容。

    2.2 在“顺序结构”中引入指针

    本章主要介绍算法和最基本的编程结构顺序结构,同时介绍了赋值语句和输入输出语句。因此本章将会在讲授赋值语句和格式输入输出语句时提前介入指针的相关概念。

    (1)赋值语句。

    在赋值语句的讲授过程中,在讲授了赋值语句的预算顺序以及作用后,可再次向学生提示,当一个整型变量x在赋值号左右两边所代表的含义之间的细微区别:在左边表示将赋值号右面的表达式的值赋值到x所代表的内存存储空间中,而在右边则表示将x所代表的的内存储空间的值赋值到赋值号左边的变量中。一个表示x对应的存储空间,另一个表示x对应的存储空间的值。在这样的解释前提下再次提出上一章提及的指针内容:

    ①请学生思考:如果有一个变量p用来存储x的地址,如果想向x赋值10,如果允许表达式p=10在c语言中运行,会带来什么结果?能否达到向x所代表的地址的存储空间写入10?

    ②告诉学生按照赋值语句的赋值规则,上述结果只会给p对应的存储空间赋值10,而不会赋值到x对应的存储空间中,因此需要使用“*p=10”的方法进行赋值。此处再次提醒学生对于指针的含义以及*p的含义。

    通过以上的讲授既让学生进一步了解赋值语句的作用,也使学生对于指针的操作与应用有了进一步的认识。

    (2)格式输入输出语句。

    在格式输入输出函数的讲授中,最容易出错的就是在scanf函数中变量参数要加取地址的符号&,此处可以再次引入指针相关的介绍。相关讲解内容如下:

    ①讲授scanf(“%d”,&x)函数的作用,是将输入的整型值存储到x对应地址的存储单元中。

    ②简单告知学生当变量作为函数参数时相当于把变量值传入函数,并未传入具体地址,从而导致函数无法获取变量的值。

    ③为了能够将地址传入函数,则需要提供一个操作符用于返回变量的地址,c语言用“&”表示取地址的操作。

    ④在上机实验课时,可以让学生通过输出语句输出x的值和&x的值,同时指导学生如何通过开发环境查看变量所在的内存,以及存储的数据。

    通过上述内容的讲述,既使学生了解了输出函数的本质和变量在内存中存储的方式,还能够进一步了解去地址符号的作用,训练了学生上机调试代码的能力。

    2.3 在“利用数组处理批量数据”中引入指针

    由于选择结构和循环结构两章主要是介绍程序结构,与内存存储和变量关系不大,这两章不再引入指针相关知识,将学生的精力全部放到这两章容易错误的知识点上,如逻辑表达式的运算,循环的边界条件等。而到了本章主要介绍数组时,就可以再次将指针相关的知识介入,加深学生的理解。本章主要从数组的定义,以及内存存储方式进行指针相关知识的介入。

    (1)一维数组定义。

    在讲授到一维数组定义时,在讲解了一维数组的定义后编译系统会根据定义的数组长度在内存中申请连续的相应大小的空间后,再次讲解指针的概念。

    ①首先让学生理解地址的概念,其实就是一块连续存储空间的首地址,其他地址根据数组的类型,依次获取相关元素。进而让学生考虑对于单个变量的情况,当变量为整型为4个字节时,所谓的变量地址其实也是类似的为这四个连续存储空间的首地址,程序在读取数据时是根据首地址依次读取四个字节的内容,获取变量的值。

    ②强调每一个数组元素都可以当做一个变量看待,即都对应了相应的内存单元,用整型数组举例。例如:

    int a[10];

    假设整型占有4个字节,让学生自己推算第i个元素的地址,即第i个元素的地址其实是a+4i。上机时通过内存查看和通过语句:

    printf(“%d”,&a[i]);

    查看数组每一个变量的地址的方式,加深数组元素地址的印象。

    ③介绍数组名代表了数组的首地址,同时扩展告诉学生,这里的数组名是一个指针常量,引导学生回忆常量本身是不可以被赋值的。

    ④再次提前讲指针变量p是可以被赋值的例如int x; p=&x; 或者int a[10]; p=a;第一个赋值表示将x的地址存入指针变量p中,而第二个赋值表示将数组a的首地址存入指针变量p中。此处的表达方式再次说明a本身就是一个指针,所以赋值时无需增加取地址符号“&”。

    ⑤再次提醒学生由于p是指针变量可以被赋值,而数组名a是指针常量,不可以被赋值,即以下代码是错误的:

    int a[10],b[10];

    a=b; //a是指针常量不可以被赋值

    ⑥告诉学生以下赋值都是正确的,并且p与q的值是相同的,进一步让学生了解数组名就是数组的首地址,即:假设p和q都是指针变量,int a[10]; p=a; q=&a[0];

    此处不可过于延展,否则将会使学生陷入过深,忽略了本章的重要内容。至此不仅使学生了解到了数组名指向数组的首地址,也再次回忆了变量与常量的区别,同时涉及了第八章指针部分的指向数组的指针的内容。

    (2)二维数组的定义。

    在二维数组的讲授中,关键要突出每一维的含义,以及各自代表的意义。具体讲授内容如下:

    ①讲授逻辑上大家认为的二维数组就是一个二维表,而实际内存存储只是简单的连续空间的存储。例如,int a[2][3]逻辑存储是2行3列,而实际存储就6个连续的内存空间,同样让学生自己推出每个元素地址的计算公式:a+4*2i+4j。上机实验课通过内存查看进一步理解二维数组的存储模式。

    ②让学生考虑a,a[0]和&a[0][0]之间的关系,都是指向首地址,此处不宜多讲,因为涉及指针变量加一的值相对难懂,为了防止学生陷入过深,此处提到即可。

    通过此章关于指针相关的内容的提前讲授,让学生对于指针在数组中的应用有了一个初步认识,为第八章数组与指针一节做好铺垫。

    2.4 在“函数实现模块化程序设计”中引入指针

    本章主要是介绍C语言的函数的定义、声明和使用,并通过变量的周期和生存期说明变量在函数中的特性。结合本章内容,可以简要地讲解指针作为函数参数的内容。

    (1)函数的定义,在本节中主要提示学生代码要运行同样需要载入内存,也同样要有地址,而函数名实际上就是函数指令存储的首地址也叫“函数入口”。

    (2)函数的嵌套调用,本节主要通过板书将每个函数画作一个独立的空间,当该函数被调用时,动态地在其空间内将函数中的变量,以及形参申请空间,并重点说明将实参的值赋值到形参对应的空间中。当该函数调用结束后,直接擦除刚刚申请的变量,直观地让学生体会到,函数内部的变量的值除了通过return语句,无法被传递至函数之外;
    也认识到函数参数之间是通过值传递,而无法通过在函数内改变实参的值。

    (3)数组作为函数参数,主要讲解数组名作为参数,数组名与变量名的关系。

    ①让学生回忆一个函数如何返回一个值,并让学生思考如果有多个值需要返回需要如何处理?进而告知C语言中有几种返回方式,一是接下来要学习的多个全局变量可以把函数中的若干值返回;
    第二是后面章节要学的通过返回结构体返回多个值;
    最后是通过指针将地址告诉函数,将结果直接存储在相应内存中,从而起到返回若干值的效果。

    ②理解函数形参test(int a[10])和调用函数中数组定义int a[10]样子一样,但是意义完全不同,作为形参的类似数组定义的a实际上是一个指针变量,说明是一个指向由10个元素组成的整型数组的首地址的指针变量,而在调用程序中定义的则是一个指针常量指代数组的首地址,通过值传递将常量的值传给了指针变量。此处点到即止不宜讲得过深,由于并未系统地进行讲授,过于深入容易让学生混乱,只需了解到它们是有区别的即可。

    ③进一步解释为什么通过数组名作为函数的参数可以将值带出函数(本节前已经让学生了解了函数内部的值是不能被函数以外的代码访问的)。由于数组名代表了数组所在的地址(如②所述),而函数用数组名作为参数,也就是在函数中指明了值需要保存的位置,直接将数值保存至函数之外了。

    通过上述的讲解让学生进一步了解了指针在函数参数中所起的作用,并加深了为什么函数无法改变实参的值的原理。对于第八章讲解“指针变量作为函数参数”一节打下铺垫。

    2.5 教学小结

    通过以上课程对于指针的提前介入,根据课程实际内容可以发现对于指针的提前介入不仅可以让学生能够提前接触到指针的概念,便于后续的学习,而且还可以加深对应章节的一些原理的认识,更能够掌握C语言的精髓。如果只是在指针一章,再将前面的内容重复补充,很难让学生有一个清楚的认识,因为大学生的学习规律与中学不同,课后复习的习惯在减弱,如果在课堂授课时没有第一时间讲清楚,相当一部分学生将会在后续的学习中淡忘,效果将大打折扣,因此在学习相关知识时应提前提及,在真正学习相关内容时,学生更容易接受和理解。

    指针作为C语言的一个重要特征和精髓,其实贯穿了整个C语言的知识之中,如果不提前接触,对于很多原理只能是死记硬背,难以融会贯通,因此本文提出了提前介入法,进行C语言中的指针知识点的教学,不仅使学生更深刻地认识到了当前所学知识的原理,也对于后续指针章节的学习有了更深的理解。实践证明(4个学期以上的实践教学),发现到了指针一章的讲解时,学生的理解和接受程度提高了很多。

    在以后的教学中,需要再深化此种教学,在不影响当前课程内容理解的同时,更深入地让学生提前了解指针,真正地掌握指针,对于C语言的应用更加得心应手,并会进一步研究提前介入法在其他课程和知识讲授中的应用与实践。

    [1]张忆文,C 语言指针教学难点透析[J]. 计算机教育,2017(1): 155-161.

    [2] 赵帅锋,胡绍海. 开门见山与循序渐进: 一种 C 语言指针教学方法[J]. 计算机教育,2017(4): 112-120

    [3] 王立柱. 数据结构与算法[M]. 北京: 华章出版社,2013.

    Application of Advance Intervention Method in C Language Pointer Teaching

    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 course, 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 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, it 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.

    C language; pointer; programming language teaching

    G642

    A

    1008-1151(2022)12-0128-03

    2022-10-10

    广东省教育厅特色项目(2017KTSCX074)。

    陈冰川(1975-),男,四川达州人,广东财经大学讲师,研究方向为软件工程、人工智能。

    猜你喜欢 数组赋值指针 JAVA稀疏矩阵算法电脑报(2022年13期)2022-04-12垂悬指针检测与防御方法*软件学报(2020年6期)2020-09-23JAVA玩转数学之二维数组排序电脑报(2020年24期)2020-07-15强赋值幺半群上的加权Mealy机与加权Moore机的关系*计算机与生活(2018年8期)2018-08-15为什么表的指针都按照顺时针方向转动广东第二课堂·小学(2017年9期)2017-09-28算法框图问题中的易错点中学生数理化·高一版(2017年1期)2017-04-25Excel数组公式在林业多条件求和中的应用林业调查规划(2017年6期)2017-03-27利用赋值法解决抽象函数相关问题オ理科考试研究·高中(2016年9期)2016-05-14寻找勾股数组的历程初中生之友·中旬刊(2015年4期)2015-06-10浅析C语言指针软件工程(2014年3期)2014-03-15
    相关热词搜索: 指针 介入 提前

    • 文学百科
    • 故事大全
    • 优美句子
    • 范文
    • 美文
    • 散文
    • 小说文章