APP下载

C语言指针教学难点透析

2017-09-20陈坤

读天下 2017年24期
关键词:数组指针C语言

摘 要:C语言是程序语言的重点,也是教学中的难点,本文对C语言教学中由浅入深地讲解了一些C语言的重难点,通过用实例对它们的性质进行详细的解读,让学生更好地理解其中的区别。

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

一、 指针变量的引用

指针变量使用时对以下得几点要格外注意:

1. 对指针变量要先下定义,定义后,再使用。

2. 对指针变量进行操作时,要保持类型的一致性。例如:int i=50;char *p=&i;;对上述指针进行分析,可以得出上述指针是非法的。因为 int 后的i是整形变量,而char是定义字符变量,这两个变量是不同类型的变量。

3. 当使用赋值给指针变量时,有一点要谨记,数值不可以直接赋值给指针变量,例如:int *p=52566,因为指针变量是储存其他变量的地址。

4. 指针变量在每次被调用时,首先需要做的就是对初始变量进行初始化,例如:int *p;printf(“*p is %d”);这样的操作就是不合法的,当程序员直接对变量进行使用时,没有初始化,那就让指针变量没有所指。

5. 当使用指针变量进行算数运算时,不是变量p进行加法运算,直接变为p+3,这样是错误的,举个例子:int a[5]={0,1,2,3,4};int *p=a;p+3;语句中,而是让指针变量指向a[3],做一个假设int 占用4个字符,p+3相当于移动了12个字符。

6. 指针变量中有三个变量,这三个变量学生常常会弄混,具体使用时,就会犯错。关于这三个变量就是const int *p;int const *p;const int const *p。const int *p,修饰*p是个const常量.而*p是指向对象的内容.所以表示指向对象的内容是常量,const变量不能被直接赋值,但是可以通过指针来修改const变量。由于const局部变量会存在栈里,而const全局变量会存在只读存储内存上所以我们可以通过指针来修改const局部变量,但是修改const全局变量,会使程序崩溃。const变量则是真正的常量了,定义时会将其放入符号表中。所以编译途中遇到使用const变量时,则直接从符号表中取出常量。只要当该const变量为全局(使用extern声明过),或者被使用&操作符时,才会被分配存储空间。int * const p,修饰 p是个const常量,而 p是指向对象的地址.所以表示指向对象的地址是个常量。

二、 指针与数组

指向数组元素的指针变量的定义与以前的指针变量的定义一样,有一点要注意的是保证数组的类型与指针变量的类型相同。例如:int i[5]={0,1,2,3,4};int *p=i;上述的两条语句都是指向数组a的元素的指针向量p,同时对指针向量p进行了初始化,指针变量指向了数组的首元素a[0]。完成上述步骤,接下来我们就可以访问数组元素了,通过使用指针变量p,例如:p+1就是指向a[1],很多学生在这里会迷惑,一定要记得,上述例子都是指针变量对一维数组元素进行访问,而现实中对二维或者多维的数组元素应用比较多,所以我们对介绍一下二维数组的应用方法。例如:int a[3][4];int *p=a;我们需要对数组的a[2][3]进行访问,为解决这个问题,我们可以使用以下方法。

p+1很多同学错误地理解为p单纯地加1,其实是指针向量指出下一个数组元素。所以*(p+1)与a[1]等价。理解了上述的原理,我们可以很容易推理出以下规律,p+i(0≤i≤4)就可以表示p指向数组元素第a[i]元素,所以*(p+i)与a[i]等价。综合上述的规律,我们可以推理出数组名与数组元素地址之间的联系,所以有*(a+i)与*(p+i)等价。

1. 直接使用数组下标 a[2][3];

2. 利用一维数组名a访问:*(a[2]+3)或*(a[0]+11)或 *(a[3]-1];

3. 利用二维数字名a进行访问,我们需要将(2)中的一维数组进行改变,改成相应的二维数组名,这样就可以实现了。*(*(a+2)+3)或 *(*(a+0)+11)或*(*(a+3)-1);

4. 用指针变量p访问:*(*(p+2)+3)或*(*(p+0)+11)或*(*(p+3)-1)等等。

三、 指针与函数

指针函数是指函数的返回值为指针类型,通俗地说就是函数最后一个返回值,这个返回值不是一个数值,而是一个地址。指针函数的定义形式为:类型标识符 * 函数名(参数名){函数体}。

对上述的案例进行分析,上述实例中,我们需要先对全局变量a下定义,紧接着对变量a进行初始化,初始化的值是6,我们在对指针函数fun( )下定义,其返回类型为指向整型的指针,参数列表为空。全局变量a的地址是由fun( )函数返回的。主函数中对指针变量p进行定义,接着对p进行初始化操作,使其指向fun( )函数,接着输出p所指向对象的值,最后的结果是*p=6。指针函数完成上述操作后,就会对所占用的内存进行释放,释放的内存会被系统回收,所以指针函数不能返回局部变量的地址。

参考文献:

[1]彭蕾.C语言指针教学难点浅析[J].科技情报开发与经济,2007(05):218-220.

[2]浙江赵国龙,顾鹏尧.C语言学习中的四大难点[N].电脑报,2003-09-15(C13).

作者簡介:

陈坤,湖南省长沙市,长沙财经学校。

猜你喜欢

数组指针C语言
JAVA稀疏矩阵算法
“C语言程序设计”课程混合教学探索
JAVA玩转数学之二维数组排序
郊游
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
更高效用好 Excel的数组公式
为什么表的指针都按照顺时针方向转动
计算机原理中C语言的应用价值
寻找勾股数组的历程