APP下载

C语言指针简化教学思考

2015-12-07邓丽萍

教育教学论坛 2015年45期
关键词:数组指针C语言

邓丽萍

摘要:《C语言程序设计》是学生刚进入大学所接触的第一门编程语言,加上课时有限,大多数学生都觉得很难、很抽象不好学,本文作者系统讨论了如何用最短的时间使学生掌握好指针的应用问题。经验表明,在讲解输入函数的时候便介绍计算机内部的存储和变量地址的含义,在数组应用时重点讲解数组名表示数组首地址含义,这都将为指针的讲解奠下基础,在讲解指针时,运用一些简单经典的例子来涵盖指针的所有知识,并取得了较好的效果。

关键词:C语言;数组;教学;指针

中图分类号:G718.5     文献标志码:A     文章编号:1674-9324(2015)45-0228-02

在C语言的教学中,“指针”这一部分内容一直是C语言的教学重点和难点,直接影响学生对后续课程的学习和把握[1-3]。作为软件开发入门课程,绝大多数时间是在讲条件、循环、数组、函数,而指针内容却是省、国家计算机二级、程序员等考试的必考内容。为了在最短的时间内达到较好的教学效果。笔者从多年的教学经验认为C语言的指针教学应该注意以下几点:

一、输入函数scanf()和数组中地址的应用

所有的书本上都有介绍scanf(格式控制字符串,输入项列表),此函数的输入项列表要用“&”加变量名,要将所输入的内容放入变量的地址中,其中格式控制串中如果有普通字符也要输入普通字符,且有很多输入后不能正确读取的情况,初学者往往感到非常困惑难以理解。其实,连续定义的多个变量在内存中也是占用连续的内存单元,只是不同的数据类型所占的字节不同,程序在运行过程中遇到第一个scanf()函数时,将要求用户从键盘上按要求输入内容,所有输入的内容都将先放入缓冲区且你可以输入很多内容,输入完成后再按scanf的格式控制字符串的格式来存入到变量的地址中,一旦输入不合法,则认为输入结束,后面的变量将取不到值。如:scanf(“%d:%d”,&a,&b);若输入时你输入3,4↙其中a的值为3,输入格式串中本来要求你输入的是“:”而你输入的是“,”,明显不合法,则scanf函数输入结束,后面的变量b将取不到值。同时这也很好解释了若程序中有多个scanf函数时,为了保证每次输入都有效,则应该在输入函数前加一个清空缓存函数fflush(stdin)。

数组名代表的是数组的首地址,所以在scanf()函数中以”%s”为格式串所对应输入项列表不需要加“&”。如:char str[20];

scanf(“%s”,str);/*将输入的内容存储到从数组首地址开始的地址中*/

printf(“%s”,str);/*从数组的首地址开始输出字符数组的内容*/。

这些内容都与计算机的实际存储有关(即和地址有关)。

二、指针

指针就是地址。其实前面我们在讲解输入输出函数和数组时,我们就介绍了一些有关地址的应用。一听自己已经用过且有所接触了,学生也就不会感到太畏惧了。再加上时间有限,我们要言简意赅地说明指针的用法。

1.指针的概念。指针就是内存地址。这里首先要区分三个比较接近的概念:名称、地址和内容(值)。名称是给内存空间取的一个容易记忆的名字;内存中每个字节都有一个编号,就是“地址”;在地址所对应的内存单元中存放的数值即为内容或值。

为了帮助读者理解三者之间的联系与区别,我们不妨打个比方,有一座教师办公楼,各房间都有一个编号,如101,102,…,201,202,…。一旦各房间被分配给相应的职能部门后,各房间就挂起了部门名称:如电子系、计算机系、环境工程系等,假如电子系被分配在101房间,我们要找到电子系的教师(内容),可以去找电子系(按名称找),也可以去找101房间(按地址找)。类似地,对一个存储空间的访问既可以指出它的名称,也可以指出它的地址。

在C语言中,如果变量p中的内容是另一个变量i的地址,则称变量p指向变量i,或称p是指向变量i的指针变量,形象地用图1所示的箭头表示。

由此可以得出结论:变量的指针即为变量的地址,而存放其他變量地址的变量是指针变量。

指针变量是一种变量,因而也具有变量的三个要素,但它是一种特殊的变量,其特殊性表现在它的类型取值上。具体而言:①变量名:与一般的变量命名规则相同。②变量的值:是某个变量的内存地址。③变量的类型:主要是其指向的变量的类型。

2.指针指向简单变量。

如:int a=100,*p;/*指针变量的定义*/

p=&a;/*指针变量的赋值*/

*p=200;/*指针变量的应用*/

printf(“%d”,a);则输出值为200。

在此我们要理解指针一旦定义且指向了一简单变量,除定义和初始化时的*p,其他的*p等价于它所指向的简单变量(即这里的*p<=>a),p(指针)等价于简单变量的地址(即这里的p<=>&a)。上面的输出语句可以变为:printf(“%d”,*p)。

3.指针指向数组。

(1)指针指向一维数组。

如:int a[5]={10,20,30,40,50},*p=a;

p++;

printf(“%d,%d,%d”,*p,*(p+2),*p++);则输出结果为:30,50,20

以上是指针指向一维数组的基本应用,首先我们要理解有关指针的运算。

&:取地址运算符[5]。

*:指针运算符(间址访问运算符),取指针所指向的值,若所指向二维数组则表示离取值进了一步。

++:算术运算符,表示指针往下或右移一个单位(其中这个单位和具体的数据类型有关,如果是整型数一个单位就指2个字节,实型指4个字节)。

--:算术运算符,表示指针往上或左移一个单位。

若定义了一个指针指向了一个一维数组,则p<=>a的使用(原来的a[i],也可以用p[i]表示,*p<=>*a),即*(p+i)<=>a[i] <=>p[i] <=>*(a+i)。但要注意p和a同为地址它们是有区别的,p为变量地址,而a是常量地址。有p++而不能用a++。

(2)指针指向二维数组。对于指针指向二维数组,要理解行地址和列地址的含义(*运算符能实现行地址向列地址的转换)再加上一维数组中的等价关系,能理解下面的二维数组的指针表示形式表即可。

(3)数组指针与指针数组的含义。前者是指针,后者是数组。定义格式:仅差一对圆括号。①指向一维数组的指针。假设有定义语句:int (*p)[4];②指针数组。假设有定义语句:int *p[4];

(4)应用场合:前者是一个指针,后者是多个指针。①指向一维数组的指针。一般将一个二维数组名赋值给一个指向一维数组的指针,来访问二维数组中的某一行。②指针数组。适合存放若干个字符串,使字符串的处理更加方便灵活。例如:

char  *menu1[]={"Copy","Cut","Paste","Delete"};

char  menu2[4][7]={"Copy","Cut","Paste","Delete"};

用字符指針数组处理字符串不仅可以节省内存,还可以提高运行效率。

4.指针指向函数。

(1)指针作为函数的参数。

其中左边交换完后,能传递给实参,因为它是指针所指向的值发生交换,而右边只是指针的指向发生改变原本值未发生交换。

(2)指针函数与函数指针。这是两个完全不同的概念,前者是函数,后者是指针。

a定义格式:仅差一对圆括号。

①指针函数。假设有定义语句:

int  *fp(int x,int y);

②指向函数的指针(函数指针)。假设有定义语句:

int  (*fp)(int x,int y);

b应用场合:前者是一个函数,只是函数的返回值是指针;后者是一个指向函数的指针,通过这个指针可以间接地调用所指向的函数。

三、总结

本文探讨了指针教学中,通过截取最基本且最重要的知识来解析其应用问题,目的在于使学生在较短的时间内掌握其基本知识,预计可作为指针教学的有效方案之一。

参考文献:

[1]管银枝.C语言程序设计实例教程[M].北京:人民邮电出版社,2011.

[2]谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2001.

[3]白羽.C语言实用教程[M].北京:电子工业出版社,2009.

猜你喜欢

数组指针C语言
JAVA稀疏矩阵算法
基于Visual Studio Code的C语言程序设计实践教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程
Excel数组公式在林业多条件求和中的应用
高职高专院校C语言程序设计教学改革探索
寻找勾股数组的历程
基于改进Hough变换和BP网络的指针仪表识别
论子函数在C语言数据格式输出中的应用
ARM Cortex—MO/MO+单片机的指针变量替换方法