C语言指针教学中定义复杂数据结构的作用及方法

2017-03-15 18:06肖泽
电脑与电信 2017年3期
关键词:运算符数组数据结构

肖泽

(清远市技师学院,广东 清远 511517)

C语言指针教学中定义复杂数据结构的作用及方法

肖泽

(清远市技师学院,广东 清远 511517)

C语言指针教学一直是一个难点,如何让学生正确理解并掌握指针的定义及作用,是摆在所有教师面前的一道难题。特别是C语言中对复杂数据结构的定义,更加抽象化且难以理解,给教学工作带来了较大的阻力。本文通过分析指针的基本概念,对指针中的变量进行详细说明,帮助学生理解各种运算符号,为定义复杂数据结构的教学提供了一些便捷。

C语言;指针教学;复杂数据

1 引言

指针的优点之一就是可以定义复杂的数据结构,使其简化、高效,便于使用。它不仅与数据的物理存储紧密相关,在其他程序中也有着非常广泛的应用,涉及的概念也十分复杂多样,学生学习起来容易显得力不从心。但是作为C语言的应用核心,指针教学的质量直接关系到学生对C语言的掌握程度。广大教师一定要把它作为C语言课程教学的重点来进行讲授,这样既能提高C语言的教学质量,也可以为学生今后学习更加深奥的计算机语言打下坚实的基础。

2 指针和指针变量的定义及作用

指针是存储计算机内存地址的变量,地址则是存储单元中每个字节的唯一编号。举例来说,如果在C语言中定义一个变量,那么程序在进行编译的时候就会给该变量分配若干字节的存储空间,首个字节的编号就是该变量的地址;而这个地址,即首个字节的编号,就是该变量的指针。如果在程序中专门用一个变量来存放另一个变量的指针,那么该变量又被称为指针变量。通常在在教学中讲述以上概念时,会运用一些比喻的手法来强化理论知识的形象,帮助学生理解这些概念。例如将学生宿舍楼比喻成计算机的存储空间,其中每间宿舍都是一个存储单元,学生相当于存储在其中的数据,而房间号就是地址,那么房间号就是住在该宿舍中学生的指针。宿舍管理室则相当于存储指针的变量,对每间房间的号码都进行管理,那么宿舍管理室就是所有宿舍房间的指针变量。

设有三条C语句:int a,*p;a=7;p=&a;

第l条语句定义了整型变量a和指向整型的指针变量p,在C语言程序中,系统会根据该语句为a和p分配相应的存储空间;第2条语句是把整数7存储到了变量a中;第3条语句是把变量a的地址存储到变量p中;那么变量p就是变量a的指针变量。想要在系统中访问变量a,查看其中存储的内容,可以通过两种方法,一是直接访问变量a,二是通过访问指针变量p来间接访问变量a。在教学时,可以继续运用比喻的方法来解释变量和指针变量的应用,即直接访问和间接访问的过程。直接访问即学生直接到相应的房间内找想要找的人,如同直接在系统中查找相应数据;间接访问则是到宿舍管理室查询所要找的房间号及学生名字,然后再去访问对应的房间和人。

3 定义复杂数据结构的方法

3.1 定义基类型

在C语言中定义复杂数据结构的第一步是定义指针变量,而定义指针变量的第一步就是定义基类型。常见的指针变量是由基类型和指针变量名组成的,指针变量的赋值要与基类型相匹配,即指针变量是专门存放基类型的变量的地址。

以该c语句为例:float a;int*p;p=&a;p=3000;

后面两条语句就是错误的,因为它们与定义指针变量的原则相悖,即没有定义基类型。在语言编辑程序中设置这样的规定是有意义的,如果指针变量能够随意指向未经定义的基类型,就会引起内存区域的不确定变化,进而导致程序崩溃;其次,定义基类型能够为指针运算提供支持。在指针运算的过程中,经常需要移动指针来处理连续的存储对象,例如数组元素;如果没有定义基类型,在处理这类数据时同样会引发程序崩溃。同时,指针的移动就是对指针变量进行加减运算而得到的,如果定义基类型,就会使运算更加简洁统一。例如在程序中给指针变量加l,实际上指针变量增加的值并不一定是1,而是一个整数n,这个n指代数据在内存空间中所占用的字节数;想要确定n的值,就要定义基类型,即指针变量所指向的数据类型。而基类型数据对象的字节数,又被称为指针变量的步长,在一些简单的运算中能够起到精简运算的目的;如果指针变量是函数类型,则其步长在运算中没有意义。

3.2 理解运算符

C语言与指针有关的运算符主要有&、*和[],它们分别代表地址运算符、指针运算符和下标运算符,其中*和[]只在表达式中起运算符作用,在指针变量定义中只能起到说明作用,没有运算符的作用,通常在定义指针变量时要在变量名之前加*来区别于普通变量。教师在讲解的过程中要把重点放在指针操作上,让学生在实践中理解运算符的作用。需要注意的是,在起运算符作用的时候,&和*互为逆运算,[]和*之间的关系可以用表达式p[i]=*(p+i)来表示。尽管&和*代表了地址运算符和指针运算符,让程序在运算中获取变量的地址及指针所指向的变量,但是在实际操作中,这两种运算符还会引申出其他含义。

以如下语句为例,int c[3][4]={8,5,4,2,l,12,9,13,21,26,6,14};它定义了一个二维整型数组c,c是一个指针常量,也是该数组的数组名,代表数组c第0行的首个字节名称,即常量地址,它指向的数据对象就是该二维数组的行。如果一个数组元素占用的字节数为2个,那么该常量地址的步长就是8。将运算符&加到数组c前面,则表示无意义。因为c是常量,它并没有占用系统的内存空间,自然就没有地址;而运算符&的含义是获取地址,但是&c却不能获取到任何地址,自然也就无意义。如果在引申含义的层面上去理解&c,则有着不同的意义。通常认为&的引申义是“使指针升级”,那么&c就不再是无意义,而是成为了一个指针常量,它指向的数据对象就是整个二维数组c,它还代表数组C的首个地址,其步长为24。同样的情况,*的引申义一般为“使指针降级”,*c也成为了一个指针常量,它指向的数据对象是该二维数组中的数组元素,它代表了数组C第0行第0列元素的地址,其步长为2。

3.3 定义复杂数据结构

指针可以定义复杂的数据结构,并说明复杂数据中所包含的各种对象,例如含有复杂元素的数组、复杂函数的指针等,从而满足应用程序在编写过程中对复杂对象的简洁化描述,提高编写效率。需要注意的是,*和[]只能在表达式中起运算符的作用,这在前面也提到过,在指针定义中它们只是简单的指针标志和数组标志。而小括号()作为优先级仅次于用户标识符的对象,也需要针对不同的情况对其含义进行区分,有时它是函数标志,有时则只是一般的括号运算符。如果()挨着用户标识符,或者挨着一个被小括号括起来的字符串,那么它就是一个函数标志;如果()内部为空,或者为一个形参表列,那么它也是一个函数标志,其他情况通常认为是普通的括号运算符。

定义复杂数据结构的实质就是说明数据中每个部分的对象及其作用,一般都是从用户标识符开始,按照优先级顺序,从高到低依次为括号运算符、函数标志、指针标志(即*)和数组标志(即[])来逐个说明。以下面函数为例。

float(*x(int))[6];解释要按照优先级顺序及其结合性顺序,x(int):x是一个函数,该函数包含了一个整型形参;(*x (int)):x是一个函数,该函数包含了一个整型形参,其返回值为指针,即x是指针函数;float(*x(int))[6]:x是一个函数,该函数包含了一个整型形参,其返回值为指针,指向了包含6个元素的一维数组,该一维数组的每个元素都是一个实型变量。

通过该举例可以看出,使用指针以后能够极大地简化复杂的数据结构,让函数的层次和顺序十分鲜明易懂。作为比较,可以使用C语言中的typedef语句来定义该函数,以便学生更好地理解其中的不同,其形式为:

{typedef float ARRAY[6];

typedef ARRAY*POINTERl;

POINTERl x(int);}

再有数组int(*f[6])(int,int);解释同样要按照顺序,f[6]:f是一个数组,该数组包含了6个元素;(*f[6]):f是一个数组,该数组包含了6个元素,每个元素都是一个指针变量;int(*f [6])(int,int):f是一个数组,该数组包含了6个元素,每个元素都是一个指针变量,指向了一个函数,该函数的原型为int函数名是(int,int)。

同样用typedef语句来定义该数组,可以得到:

{typedef int(*POINTER2)(int,int);

POINTER2 f[6];}

4 总结

指针是C语言中的精华,掌握了指针的定义和方法,能够有效地简化复杂的数据结构,提高编写的效率和正确率。但指针也是学好C语言的一道难关,因为其概念复杂多变、使用方法灵活多样,很多学生在学习的过程中容易产生畏难情绪。这就要求教师在教学中要根据由浅入深的原则,做好基础知识点的讲授,然后结合实践范例,引入一些难点和重点,并通过反复练习来达到熟练掌握的目的。本文所讨论的关于指针的概念及定义复杂数据结构的方法,仍然十分浅显,对于实际教学的帮助略显不足。仅希望能够起到一些抛砖引玉的作用,为今后的C语言指针教学积累一些有益的经验。

[1]杨天明.C语言指针教学难点探析[J].中国科教创新导刊,2014 (8):137-138.

[2]吴斌.C语言指针的教学[J].安徽职业技术学院学报,2004,3 (3):67-69.

The Function and Method of Complex Data Structures Definition in C Language Pointer Teaching

Xiao Ze
(Qingyuan City Technician Institute,Qingyuan 511517,Guangdong)

C language pointer teaching has always been difficult.It’s a difficult problem faced by the teachers that how to let students understand the definition and role of pointer correctly.Especially,the definition of complex data structures in C language is more abstract and difficult to understand,bring great resistance to the teaching work.This article analyzes the basic concept of pointer,and elaborates the variable of pointer in detail,helping students understand the operation symbols and providing convenient for the teaching of defining complex data structure.

C language;the pointer teaching;complex data

TP312-4;G642.4

A

1008-6609(2017)03-0067-02

肖泽(1980-),男,江西吉安人,本科,计算机一级实习指导,研究方向为职业教育。

猜你喜欢
运算符数组数据结构
JAVA稀疏矩阵算法
老祖传授基本运算符
数据结构线上线下混合教学模式探讨
JAVA玩转数学之二维数组排序
为什么会有“数据结构”?
用手机插头的思路学习布尔运算符
Excel数组公式在林业多条件求和中的应用
高职高专数据结构教学改革探讨
C语言中自增(自减)运算符的应用与分析
寻找勾股数组的历程