指针教学实践

2013-04-23 03:03刘井莲赵卫绩马春华
绥化学院学报 2013年3期
关键词:数组指针C语言

刘井莲 赵卫绩 马春华

(绥化学院 黑龙江绥化 152061)

一、序言

指针是C语言的一个重要概念,在C语言的教学中,能否正确理解和使用指针是衡量学生是否掌握C语言程序设计的一个重要标志,也影响学生在后续课程《数据结构》和《C++程序设计》等课程的学习。每一个学习C语言的人,如果不会指针,就没有真正掌握C语言。但对于初学者来说,指针概念不易于理解,不易掌握。因此关于C语言指针的教学方法及相关教学研究得到了较多关注[1~3],并提出了很多好的教学方法。基于此,针对我院C语言学习情况,结合多年C语言教学经验,在深入探讨C语言中循环和函数核心知识点问题的基础上[4~5],从指针的教学的导入、指针概念运算初始化几个方面对C语言指针进行了分析和探讨,并结合与数组和函数的关系进行了深入的研究分析,使学生很快进入到C语言程序设计中来,为数据结构、C++等后续课程的的学习奠定了坚实的基础。

二、导入

在前面学习中,数据分为常量和变量,变量的值是可以改变的,而常量是一个具体的值。那么变量在内存中是如何存储的、如何读取的呢?如果在程序中定义了一个变量,例如int a;在对程序编译时,系统会在内存中为变量a分配4个字节的内存空间。内存区每个字节都有一个编号,这就是地址。而系统是通过地址找到对应的变量单元,例如在C语言中为变量a输入值,代码是:scanf(“%d”,&a),“&”是取地址符号,处理过程是在“int a;”之后系统已经自动为这个变量分配了4个字节的存储空间,当为变量a输入具体值,首先在内存中找到变量a的地址,然后将输入的值存到到该地址对应的存储单元中。打个比方,地址是教室的具体位置,而变量名是教室编号,变量值是教室中学生。由于通过地址可以找到所需存储单元,可以说地址指向对应变量,因此C语言中,地址形象化地称为指针。知道存放地址的变量是指针变量,导入到下一节“初识指针变量”。

三、初识指针变量

(一)认识地址符号“&”

介绍指针变量之前,首先需要理解楚下变量、变量值和变量的地址之间的关系,下面以实例1来认识地址符号“&”,弄清变量、变量值和变量的地址三者之间的关系。

实例1:

#include

int main()

{int i=13;

printf("i=%d&i=%d ",i,&i);return 0;}输出结果:

i=13&i=1245052

通过输出结果,可以看出“&”是取地址符号。

(二)指针变量性质

变量有三个要素:变量名、变量值、变量的地址。指针变量也是变量,那么也有三要素,即变量名、变量值和变量的地址。以实例2说明如下。

实例2:

输出结果:

i=13&i=1245052

p=1245052&p=1245048

通过实例2,可以看出指针变量名为p的值是1245052,由于p是指针变量,存储的是i的地址,因此变量i的地址就是p的值,有&i=1245052。p是指针变量也是变量,也有地址,地址是1245048。

(三)指针变量存储

指针变量在内存中占4个字节,与指向的变量的数据类型无关。下面以实例3说明如下。

实例3:输出结果:

size of c=1 size of i=4

size of p1=4 size of p2=4

通过实例3说明,指针变量p1和p2虽然指向不同数据类型的变量,但p1和p2在内存中占的存储空间都是4个字节。通过多次实验,定义多个指针变量,指向多个存储空间,得到结论都是指针变量所占存储空间是4个字节,读者也可以自己进行测试。

(四)“*”运算符

访问内存中的数据有两种方式:直接访问和间接访问。直接访问就是通过变量来实现,变量是内存中的某一块存储区域的名称,这种访问方式比较简单,也较常用;间接访问就是通过指针来实现[6],下面通过实例4来说明间接访问方式。

实例4:

代码“i=4;”是对变量i的直接访问,代码“int*p=&i;”是声明一个指针变量,使指针变量p指向整型变量i,代码“*p=6;”是对变量i的间接访问,将指针变量p所指向的变量赋值为6,因此第一次输出i值,结果为4,第二次输出i值,结果为6。

四、指针的相关问题探讨

在认识了指针变量后,提到C语言教材中指针的前面章节中介绍了两个重要知识点“数组和函数”,对于数组和函数与指针有很多联系,引入“函数与指针”和“数组与指针”。

(一)函数与指针

普通变量可以作为函数参数,指针变量也是变量,当然也可以作为函数参数,具体用法见实例5。

实例5:

输出结果:

i=5&i=1245052

p=1245052*p=5&p=1244972

这种方式还是“值传递”,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值(即地址,这种改变也影响不到实参),而是实参地址所指向的变量的值。通过这个实例,可以看出实参是 &i(值为1245052),传递给形参 p(值为1245052),而形参p是内存中的另一个变量,地址为1244972。

如果在fun函数中增加一条语句 *p=6;是对变量i的间接访问,将i的值修改为6,而如果增加 int j=9;p=&j;*p=10; 先修改p的值,p保存的是变量j的地址,*p是对j的间接访问,将j修改为10,因为p保存的已经不是变量i的地址了,所以与i无关了。

为了更好地强化指针变量作为函数,下面再以一个典型实例分析,见实例6。

实例6:

输出结果:

第一次交换后:i=3 j=4

第二次交换后:i=4 j=3

通过实验结果我们可以发现,在第一次交换,主函数通过调用swap1函数,将变量i,j的值传递给了形参p,q。在swap函数中的交换的是p和q的值,p和q值交换后,并不能将交换后值传给i和j,即普通变量作为形参,实参值传给形参,但形参值不能传给实参;在第二次交换,主函数通过调用swap2函数,将变量i,j的地址传递给了形参p,q。swap2函数中的*p和*q是对i,j的间接访问,*p和*q表示的是p和q所指向的变量,由于i和j的地址值是p和q,p和q所指向的变量则是i和j,在swap2函数中交换p和q所指向变量的值,即就是交换i和j的值,因此在调用swap2函数后,实现了交换i和j的值。

(二)数组与指针

通过指针变量可指向一个简单变量,而数组元素可当作简单变量使用,因此指针变量也可指向数组元素,因为数组是存储在一片连续的内存区中,当指针指向某个数组元素后,可通过向前或向后移动指针访问数组中的其它元素。数组是由多个数组元素组成的,一个数组元素的首地址是第一个元素的地址。指针变量可以指向变量,当然可以指向数组元素。

从前面的学习者,知道数组在内存中是连续存放的,例如int a[10],表示10个同种数据类型的变量,即数组元素:a[0]~a[9],那么每个元素的地址则为:&a[0]...&a[9],数组元素的地址也可以记作 a,a+1,...,a+9,即 a 与 &a[0]等价,表示第一个数组元素a[0]地址。由于指针变量值为地址,因此,可以定义指针变量,用来指向数组元素。

例如定义:int*p;则p=a;

则表示数组元素a[i]可以使用指针法:*(a+i)或*(p+i),从这个关系虽然可以说*(a+i)等价于*(p+i),但值得注意的是a和p并不等价,数组名可以说是常量指针,而p是变量指针,对于a,不可以使用“a++”,即数组名不能加加运算,a的值不能改变,而p是变量指针,因此可以进行“p++”操作,如果有int*p;p=a;则p++;p的值为a+1。数组名是存储地址的常量指针,因此数组名不能进行自加自减等运算,而指针变量是变量,其值可以发生变化,可以进行相应的自加自减等运算。

数组除了一维数组之外,常还有二维数组和多维数组,由于多维数组比较复杂,较难理解,也不常用,暂不做介绍。

五、总结

指针是C语言的核心知识点,是C语言的精髓,正确理解和使用指针对C语言的学习至关重要。本文在教学实践中,从指针的导入、指针概念的理解以及指针涉及的相关难点问题三方面进行探讨,层层深入、承上启下,顺序安排合理,便于学生全面理解指针的概念和用法,真正提高了学生C语言的编程能力。

[1]裴新凤.如何正确地使用C语言的指针[J].西北民族学院学报,1999,20(6):41-43.

[2]高阁.C语言指针教学的研究与探讨[J].机电产品开发与创新,2010,23(1):185-187.

[3]梅维安.C语言中指针教学方法 [J].阴山学刊,2009,23(4):93:95.

[4]刘井莲,樊守芳,尚晓丽,包向辉,王志国.C语言函数教学实践[J].通化师范学院学报,2011(8):58-60.

[5]赵卫绩,刘井莲.实例教学法在C语言循环教学中的应用[J].通化师范学院学报.2012(10):50-51.

[6]国家863中部软件孵化器.C语言从入门到精通[M].人民邮电出版社,2010:236-237.

猜你喜欢
数组指针C语言
JAVA稀疏矩阵算法
基于Visual Studio Code的C语言程序设计实践教学探索
JAVA玩转数学之二维数组排序
基于C语言的计算机软件编程
为什么表的指针都按照顺时针方向转动
Excel数组公式在林业多条件求和中的应用
高职高专院校C语言程序设计教学改革探索
寻找勾股数组的历程
基于改进Hough变换和BP网络的指针仪表识别
论子函数在C语言数据格式输出中的应用