C语言指针教学方法
C语言指针教学方法 摘要:学生普遍反映C语言中的指针抽象、难懂,对指 针的编程容易出错,在编程中无法灵活应用指针等问题提出 理论讲解、程序调试与内存分配相结合的教学方法,将抽象 概念的指针具体化、可视化,极大提高学生对指针的掌握和 应用能力。关键词:C语言;
指针;
程序调试;
内存分配;
教学方 法 一、引言 C语言具有高效、灵活、功能丰富和较强移植性等优点, 是近年广泛使用的编程语言,是高校理工科学生的必修课程。
C语言是计算机、电子工程、通信工程等理工学科重要的基 础课程,是学生学习程序设计的入门课程,是后继《数据结 构》《单片机原理与应用》基础课程。但很多学生认为C语 言中的指针抽象、灵活,不好理解,更谈不上编程应用,老 师也找不到好的办法让学生听明白、理解清楚。针对上述问 题,提出理论讲解、程序调试与内存分配相结合的教学方法。
用内存分配具体化、可视化讲解指针,以便学生理解、掌握 和应用指针。
二、指针教学方法 在C语言中,要理解指针,必须理解内存、内存地址、 内存变量、变量类型等基本概念。内存也称作内存储器,由 半导体器件制成,是CPU能直接寻址的存储空间,作用是暂时存放程序和数据。内存地址是内存储器中存储单元的编号, 由于存储器中存储单元数量众多,为了便于查找,需要给每 个存储单元赋予一个存储器地址。内存变量简称变量,是内 存中存储数据的位置名称,在这个存储位置中存放的数据在 操作期间通过这个变量名称进行读和写。变量和内存是两个 不同的概念,C语言是通过变量查找内存地址并在该内存进 行读写数据,而不是直接对变量进行读写,变量有名字和数 据类型。所有变量都具有数据类型,数据类型决定怎样将数 据存储到内存中,各种数据类型需要的内存大小是固定的。
C语言中数据类型分为基本类型、构造类型、指针类型和空 类型Void,基本类型又分为整型、字符型等。通过实例程序 1来说明,实例程序1的调试图如图1所示.结合实例程序1和 程序调试图1进行分析,语句“inti,j,m,n;
”申明四个 整型变量i、j、m和n。变量i关联到内存起始地址0x0012ff7c, 变量j关联到内存起始地址0x0012ff78;
整型变量i和j的内 存大小都为4个字节,说明相同数据类型的变量分配固定大 小的内存空间;
0x0012ff7c比0x0012ff78大4个字节,刚好 是整型变量j分配的4个字节,说明变量i和j分配了连续的内 存空间,变量i和j是否分配连续内存空间是由运行环境决定 的;
语句“i=1;
”的作用是通过变量名i查找到内存起始地 址0x0012ff7c,写数据1到从起始地址为0x0012ff7c的连续4 个字节中。在C语言中,指针是一种类型,也就是前面提到 的指针类型,就像C语言中普通的整型、字符类型一样,只不过指针类型描述了一个地址,这个地址指向另一个变量分 配的内存地址。简言之,指针是指向另一个变量地址的地址 变量。指针声明的一般形式为:基类型*指针变量名,其中, “*”是声明指针类型标识,“基类型”是C语言中一个有效 的数据类型,是指定“指针变量名”所指向的数据类型。例 如,语句:int*point;
,声明了一个指向整型数据的指针 类型变量point。指针变量是一种特殊的变量,该变量存储 的值是一个普通变量的地址,声明指针变量时,就像普通变 量一样要分配存储空间,该指针变量也有地址。用实例程序 2进行分析说明在图2中调试窗口的右边可以发现变量i的起 始地址是0x0012ff7c,i的值为6,指针变量p的起始地址是 0x0012ff78,p的值是0x0012ff7c,0x0012ff7c正是i的起始 地址。程序调试图不能直观表示指针结构,用内存分配图直 观表示调试结果,如图3所示。图3清楚地显示整型变量i和 指针变量p,i和p的首地址分别是0x0012ff7c和0x0012ff78, 它们的值分别是6和0x0012ff7c,i和p的地址和值都是通过 程序调试图2得到的,是真实的。从图中可以发现指针变量 和普通整型变量一样都有分配地址和值,只不过指针变量p 的值是一个地址值0x0012ff7c,而i的值是一个普通的整型 值6,这正是指针类型变量与普通类型变量的区别。从图中 还可以发现指针变量p的值0x0012ff7c正是整型变量i的起 始地址,这就说明指针p指向了整型变量i。
三、在定义和使用指针时应注意的问题1.定义指针变量时必须指定基类型。从指针的定义可以 知道,指针变量的基类型就指定指针只能指向特定的数据类 型,数据类型确定内存分配的内存空间。指定基类型的指针 变量指向一块确定大小的内存空间,内存空间的起始地址赋 值给了指针变量。在以后的指针使用中经常会用到“使指针 移动1个位置”或“使指针值加1”等语句,这个1代表什么 呢?如果指针指向一个整型变量,那么“使指针移动1个位 置”意味着移动4个字节,“使指针加1”意味着使地址值加 4个字节。如果指针指向一个字符型变量,增加的不是4而是 1。必须指定指针变量所指向的变量类型。2.指针使用前必 须初始化。语句“inta;
”申明了一个整型变量a,给变量a 分配了4个字节的内存空间(假定是32位寻址空间),那么 变量a有没有值呢?有一个不确定的值。如果语句改为 “inta=3;
”,它即申明了一个整型变量a,同样分配内存 并且给a赋初值3,3是一个确定的值。不管变量a是否赋初值, 接着使用变量a都不影响程序的运行。但指针变量就不一样, 必须为指针变量赋初值,否则程序就可能出现运行错误。例 如语句“int*pt;
”,只申明了一个指针变量pt,为变量pt 分配了内存空间,pt的值同样是一个不确定的值,如果下一 条语句是“*pt=5”,即把pt指向的内存空间的值修改成5。
因为pt的值是一个不确定的值,它可能指向内存的任何地方, 如果指向系统内存区,系统会保护系统内存区,不允许编写 的程序修改它,那么系统就会出现运行错误。怎么办呢?必须为指针变量赋初值,把语句“int*pt;
”修改成“inti=2;
int*pt=&i;
”即把i的地址赋初值给指针变量;
如果不想pt 指向任何地方,可以用语句“int*pt=NULL”,它表示申明 指针变量pt,pt不指向任何地方,需要指向某个地方时再为 它赋值,这样就不会出现运行错误。3.不能用整数给指针变 量赋初值。如int*pt=1000,这是错误的。认为可以将1000 作为地址值赋初值给指针变量pt,但编译系统并不把1000作 为地址,而认为是整数,因此语法是错误的。综上所述,通 过程序实例和程序调试简洁而清楚地阐述内存、内存地址、 内存变量、变量类型等基本概念以及指针类型、指针所指向 的类型、指针本身所占据的内存区和指针的值等指针基本概 念。提出理论讲解、程序调试与内存分配相结合的教学方法, 将抽象概念的指针具体化、可视化,在教学实践过程中得到 学生好评。
参考文献:
[1]汪繁荣,刘洋,陈辉,钱金良.《C语言程序设计》 课程教学改革探[J].教育教学论坛,2016 [2]卫军超,薛鹏鹏.C语言程序设计教学改革浅析[J]. 信息与电脑,2016