《C语言》教学中指针的教法探究

发布时间:2017年06月13日 信息来源:本站原创 点击:

在《C语言》的教学中,指针这一章一直C语言教学中的一个难点,甚至可以说是难点中的难点。但是要知道,指针是C语言的灵魂,指针在C语言中的地位是非常重要的。因此在教学中,如何让学生能够理解,掌握指针的概念及用法,就显得尤为重要。

我在教学中,通过自己的摸索,对指针有以下几点体会,与大家分享。在引入指针的概念的时候,我通常会举一个例子,让开始变得简单些。这个例子是,

寻找宝藏时,我们一般都需要藏宝图,如何得到藏宝图呢?在寻找宝藏之前,我们踏上寻找藏宝图的旅程。那么,找到藏宝图是不是就算找到宝藏了呢?那肯定不是,找到藏宝图,再通过藏宝图的指引,我们才能顺利找到宝藏。因此,这就是两个寻找的过程。那么,指针,就是藏宝图所在的位置。

    然后,我再引出指针的定义。

关于指针的定义,很多教材一般给出“它是一个地址”,“存储的是变量的地址”,“指向了一个值”等等描述。这样描述其实也没错,但是如果没有前面例子的铺垫,那就是不那么好理解。

我觉得要理解指针,无需给出什么定义,只需讲透如下5个点,我认为基本就可以理解一个指针了。这5个点我总结如下:

1. 指针是一个普通的变量;

2. 既然指针是变量,那么肯定有自己的类型;

3. 既然指针是变量,那么肯定有自己的值;

4. 只不过指针的值跟一般变量的值不太一样,指针的值是一个“地址”。

5. 指针指向的数据

为了理解5点,下面列举一段代码,如下。

#include <stdio.h>

#include <string.h>

int main(void)

{char string[15] = "ShiXP love C!";

char c = string[0];

char *pointer;

pointer = &string[0];

printf("指针pointer的值是%p \n", pointer);

for(int index = 0;index < strlen(string); index++)

{printf("第%d个字符是:%c \n", index + 1, *(pointer + index));

}

return 0;

}

下面结合代码来谈谈那5个点:

1. 指针是一个普通的变量

本例中,有一个字符变量“c”,它的值是string[0],也就是“S”,这个好理解。

还有一个指针“pointer”,它也是一个变量,和字符“c”一样,就是一个普通的变量而已,它也有一个值,它的值是“&string[0]”,从运行结果来看,就是“0022FED9”,这是一个16进制的数。

2. 指针自己的类型

本例中,字符变量“c”的类型是“char”,数组string的类型也是“char”,那么指针“pointer”的类型也是“char”。不过与c和string的类型char相比,pointer类型的char却有一点小区别。

变量c的类型char说明了c的值“S”是一个字符数据,数组string的类型char说明了其每一个数组元素也是字符数据,但是指针pointer的类型char是不是也说明“0022FED9”是一个字符数据呢?当然不是

3. 指针自己的值

上面已经说了,指针既然也是一个变量,那么肯定有自己的值,在本例中,指针自己的值就是“0022FED9”,是一个16进制的数,这个值哪来的?是“&string[0]”赋予给指针的。

“0022FED9”这个也是很多教材中提到的“地址”。很多人会想,你告诉我“0022FED9”是一个值我还好理解,你告诉我它还是一个什么地址,下面第4点就来说说这个“0022FED9”。

4. 指针的值

不知大家发现没有,在C程序中,如果定义了int,char等变量,那么在代码中很多地方都会用到这些变量的值。比如在本例中,定义了数组string,则接下来的代码就用到了数组的元素,也就是printf函数输出来。如果定义了一个指针变量,可能大家很少看到在代码中会用到指针的值,比如在本例中,大家就没有看到用到“0022FED9”。

确实,相比一般类型变量的值被频繁使用而言,指针的值很少会被直接用到。但有一个角色用指针的值用的非常多,就是操作系统。

上面也说了,“0022FED9”是被系统用的最多,为啥被系统用的最多呢?因为“0022FED9”是一个地址,是string数组的第一个元素“S”的地址。说的再通俗一点,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”。

5. 指针指向的数据

在第4点说到,字符“S”放在一个大小为1BYTE的内存块里,这个内存块的地址就是“0022FED9”,那么,我们就说,指针“pointer”的值是“0022FED9”,在地址为“0022FED9”的地方放了一个字符“S”,这个“S”就是指针“pointer”指向的数据,且通过“*pointer”这种写法来获取“S”,从某种意义上来说:

pointer 等于 0022FED9;

*pointer等于“S”,加上*号,就是拿到“S”。

此时我们可以说说第2点中提到的指针的类型是来修饰谁的问题了。在本例中,pointer的类型char显然不是来修饰“0022FED9”的,它是来告诉操作系统,我pointer认为“0022FED9”这个地方存放的是字符,是字符,是字符,且占1个BYTE的大小。

如果pointer的类型改为int,我pointer就认为“0022FED9”这个地方存放的是整数,是整数,是整数字符,且占4个BYTE的大小。

把这五点稿懂了,对指针也就能够理解了。

    以上的地址,为内存随机生成。


(作者:泗洪中专 刘利 编辑:sihzz)
上一篇:《职业道德与法律》课堂教学反思
下一篇:宿迁技师学院 举办“周一教师大讲堂”教研活动
打印本页 导出pdf 关闭页面