您好, 访客   登录/注册

C语言指针教学重点和难点问题浅析

来源:用户上传      作者:杨阳

  摘  要: 随着互联网技术的飞速发展,计算机教学对基础课程的要求越来越高。本文以《C语言程序设计》中指针教学为对象,通过探讨概念、种类和用法,详细讲解了二维数组、行指针、二级指针、指针数组之间的区别和关系。实践证明,对于指针重点难点的分析,有利于学生C语言知识体系的建立。
  关键词: C语言;指针;计算机教学;重难点
  中图分类号: TP3    文献标识码: A    DOI:10.3969/j.issn.1003-6970.2019.06.045
  本文著录格式:杨阳. C语言指针教学重点和难点问题浅析[J]. 软件,2019,40(6):197199
  【Abstract】: With the rapid development of internet technique, more computer teaching requirements for basic courses are needed. This article focusing on pointer teaching of《C Language Programming Design》, exploring concepts, types and usage, gives a detailed explaination of the differences and relations among two-dimensional array, row pointer, two-level pointer and pointer array. The practice shows the analysis of key and difficult points of pointer is beneficial for the establishment of students’ C language knowledge system.
  【Key words】: C language; Pointer; Computer teaching; Key and difficult points
  0  引言
  随着互联网技术的飞速发展,计算机应用渗透到社会生活中的方方面面,性能优良、用户体验好的软件应用成为互联网行业产品准入标准,人工智能的兴起,促进了软件向智能化转变。这些市场需求的变化,要求计算机专业人才除了有全面的技术素养,更要重视能力和基础。这主要体现在,通过基础知识的掌握,能够快速进行学习领域环境的迁移,能够解决实际生产中遇到的各种问题。《C语言程序设计》是软件工程学科的专业基础课程,是其他程序设计语言教学(如C++/Java)的先行課程,对于理解计算机系统原理、编译技术起着重要作用。通过《C语言程序设计》的学习,学生能够掌握面向过程编程的基本范式,理解程序运行的基本原理,进而快速过渡到面向对象程序设计。总之,C语言是计算机专业基础教学的重要内容[1],对于提高程序开发素养具有重要意义。
  在《C语言程序设计》教学中,指针是贯穿整个课程的核心内容[2],也是学生学习的重点和难 点。本文通过对指针用法的解释和剖析,建立清晰的认知概念,促进学生对于各类指针用法的熟练  掌握。
  1  C语言指针教学重难点概述
  指针是C语言中非常重要的概念,通过对指针的学习,可以使学生了解C编译系统的寻址原理[3],增强对变量名和变量地址之间内在关系的逻辑认 识[4],并灵活操作数组、字符串和函数间参数传递。正因为指针概念贯穿了多个知识点,使用起来“变化多端”,给学生掌握带来不同程度的困难。本文将通过讨论C指针的若干重难点,如指针和地址的关系、指针与数组以及二维数组、行指针、二级指针、指针数组之间的关系等,较为全面的阐述指针的多种用法,使C语言教学更加清晰简洁。
  2  C语言指针若干问题探讨
  2.1  指针和地址
  关于指针和地址之间的关系,不同的资料给出了各自的解释。有解释为“指针就是内存地址”[5],有将指针理解为一种特殊的变量,这种变量专门用来存放其它变量的内存地址。本文主要采用后一种理解,并不加区分“指针”与“指针变量”。对于32位操作系统而言,任一变量的地址是4个字节,不管指针变量的基类型是什么,指针变量自身都占用4个字节。指针基类型还主要用来确定指针每移动一个逻辑单位所跨越的字节数:基类型为int的指针每加1向后移动4个字节,基类型为double的指针每加1向后移动8个字节,这就意味着不同基类型的指针不能混合使用。
  2.2  指针和数组
  2.3  二维数组、行指针、二级指针、指针数组之间关系
  对于二维数组作为函数实参,那么形参的类型是fun (double (*a)[N]),即以一个行指针作为形参接受二维数组,二维数组名可以赋值给行指针。
  对于指针数组(double *arr[N])作为函数实参,那么形参的类型是fun ( double **a),即以一个指向指针的指针(二级指针)作为形参接受指针数组,指针数组名可以赋值给二级指针。
  二维数组、行指针、二级指针、指针数组之间关系的示例如下所示:
  void main(){
  int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11, 12}};
  int(*hanP)[4]; //行指针
  int **twoP; //二级指针
  int *p[3]; //指针数组
  //指针数组的用法   for (int i = 0; i < 3; i++) {
  p[i] = arr[i];
  }
  //行指针用法
  hanP = arr;
  //二级指针用法
  twoP = p;
  printf("%d  ", hanP[1][2]);//7
  printf("%d  ", p[1][2]); //7
  printf("%d  ", twoP[1][2]);//7
  }
  在上面的示例中,首先声明定义了一个二维数组arr,行指针hanP,二级指针twoP,以及指针数组p。对于指针数组p而言,每一个元素都是一个普通指针,所以在对指针数组进行初始化的时候,其每一个元素都用一个列指针arr[i]来赋值,表示对应二维数组中某一行的起始元素地址。对于行指针hanP而言,直接用数组名arr进行赋值,因为数组名arr本身也是行指针类型。对于二级指针twoP而言,它表示指向指针的指针,它存储的内容是另一个一级指针的地址,这与指针数组名p相对应,所以将p赋值给twoP。
  如上所示,二级指针twoP、twoP+1、twoP+2、twoP+3分别指向一个一级指针p[i],即二级指针采用指针法*(twoP+i)或下标法twoP[i]可以获取指针数组中每个元素p[i]的值。在指针数组中,通过p[1][2](或 *(*(p+1)+2) )能够获取到二维数组中第1行、第2列(从0开始计数)的元素7,那么,根据前面的分析,twoP[1](或 *(*(twoP+1)+2) )也能够获取到二维数组中第1行、第2列的元素7。
  對于行指针与二级指针的关系,首先将行指针通过*运算转化为列指针,然后再进行赋值操作:*twoP = *hanP。
  综上讨论所述二维数组、行指针、二级指针、指针数组之间的相互关系,可以发现,不同种类的指针代表不同的寻址方式,或者说不同的地址计算方法,它们之间可以按规则进行转化。
  3  结束语
  基于软件专业课程标准的新要求,探讨了《C语言程序设计》这门课中关于指针部分的重点和难点。通过对相关内容的介绍,特别是指针与地址、指针与数组以及二维数组、行指针、二级指针、指针数组之间关系的讨论,梳理了C语言课程教学中的知识要点,有利于教师的授课和学生的学习,对教育教学有一定的促进作用。
  参考文献
  [1] 李晓东, 魏惠茹, 董振华. 项目驱动教学法在计算机程序设计语言课中的探索[J]. 软件, 2015, 36(4): 107-109.
  [2] 赖晓燕, 赵浩, 程铃钫. 基于CS2013的程序设计基础课程建设[J]. 软件, 2018, 39(6): 16-19.
  [3] 田淑清. 全国计算机等级考试二级教程——C语言程序设计(2018年版)[M]. 北京: 高等教育出版社, 2017: 98.
  [4] 谭浩强. C程序设计[M]. 4. 北京: 清华大学出版社, 2010: 220.
  [5] 丁留海. C语言指针的底层原理[J]. 电子技术与软件工程, 2016(21):257.
  [6] 孔浩. C指针编程之道[M]. 北京: 人民邮电出版社, 2011: 28.
  [7] 张峻. 论C语言中指针和数组关系[J]. 科技资讯, 2009(17): 28-29.

转载注明来源:https://www.xzbu.com/8/view-15016127.htm