C语言指针学习必要性分析
2020-07-06曹雁
摘 要:C语言指针教学过程中碰到的举棋不定的疑惑和学生不易理解的问题,本文通过对问题的反思,采用有针对性的案例分析了指针学习的必要性,为学生树立了指针必须学而且要深入学的信念。
关键词:C语言;指针;必要性
1 绪论
C语言是1972年诞生,至今仍然活跃的编程语言,在编程语言发展历程中具有举足轻重的地位。实际应用中,C语言兼顾了高级语言和汇编语言的优点,以其丰富的语法结构、可移植性、允许直接访问物理地址、直接操作硬件、执行效率高等优势,广泛应用于计算机系统开发和应用程序底层开发。
正因为如此,各大高校将C语言设置为计算机专业核心专业基础课,掌握好C语言是评价学生计算机应用能力的重要标准,学生熟练掌握了C语言相关知识,不仅能深入理解计算机工作原理,而且为今后学习其他编程语言打下坚实的基础。
C语言作为计算机专业学生学习的第一门编程语言课程,课程目标之一就是激发学生的学习兴趣,让学生爱上编程。在实际教学中,学生起初对C语言学习兴趣度很高,但随着学习的深入,难度不断加大,特别到了指针部分的学习,如果前期基础知识不牢固,更容易让学生丧失学习兴趣,学生会认为指针是难以逾越的大山,导致后期的教学工作无法顺利开展,教学目标难以达成。指针作为C语言的特色和精华,学习了C语言,而没有学习指针,那可以说没有学习C语言。
当前很多主流计算机编程语言,隐藏了指针的概念,但功能却很强大,那么为什么要学习C语言的指针呢?实际教学过程中,发现很多例题和习题可以不用指针实现;教材中指针部分也基本上是将之前的例题用指针实现,那为什么一定要用指针实现呢?如果不能很好的回答这些问题,就没有深刻理解和学习指针。下面,通过案例来体会为什么必须学习指针。
2 必要性分析
2.1 指针可以提高程序的执行效率
冯·诺依曼计算机工作原理是将程序预先存放在主存储器中,使计算机在工作时能够自动高速地从存储器中取出指令,并执行。根据该原理,程序执行之前都要装入内存单元中,当程序运行时,从内存中取指令代码和数据到CPU中,分析指令、执行指令。仔细分析这个过程,发现分析指令和执行指令的速度是和计算机的CPU配置密切相关的,但从内存取指令和数据,这个过程是可以通过技术缩短时间的,这个技术就是指针。下面通过例子进行阐述。
int num = 9;
printf(“%d\n”,num);
上述第1条语句定义了一个int类型的变量num,并赋值为9,也就是在内存中开辟了一块空间,名字命名为num,如图1所示:
程序执行到第2行的时候,通过变量的名字num来访问该变量的值,这就相当于你的朋友从远方给你邮寄了一份快递,快递单上只写了你的名字和电话,那么快递员首先要通过你的电话,问清楚你的住址,然后再去送快递给你。
那么如果使用指针呢?
int num = 9;
int *p = #
printf(“%d\n”,*p);
仔细分析上面的代码段,其中第2行表示定义一个指向int类型的指针变量p,并用来保存变量num的地址,也就是指针p指向变量num,如图2所示:
采用指针可以实现快速取数据,比如远方的朋友邮寄了一份礼物,快递单上记录了你的住址,那么快递员根据住址送货到家。和第1种方法相比,使用指针可以快速的取指令和数据,节省了时间,提高了程序执行效率。
2.2 使用指针创建动态数组
我们编写的程序在执行前不能确定要开辟多大的存储空间,在运行过程中通过键盘动态输入,比如下面的程序代码:
#include
void main()
{
int n;
scanf(“%d”,&n);
int a[n];
a[1] = 2;
printf(“%d\n,a[1]);
上面代码编译报错,最关键的错误就是数组不能动态开辟大小,也就是程序不能在运行的时候才申请数组空间,也就是在申明或者定义数组的时候,数组的大小必须是常量。之前我们解决这个问题,数组长度通常给定一个比较大的值,但这样会造成内存空间的浪费。解决这个问题,必须使用指针动态申请空间。具体实现代码如下:
#include
void main()
{
int n;
int *p;
scanf(“%d”,&n);
p = (int*)malloc(sizeof(int) * n);
*(p+1) = 2;
printf(“%d\n”,*(p+1));
free(p);
}
上述代碼运行成功,使用指针可以完美的解决在运行过程中动态确定存储空间的大小,使得代码更加灵活和通用。
2.3 使用指针作为函数参数可以改变变量本身的值
在学习指针时有个经典的案例:交换两个变量的值。这里我们自定义函数swap()实现交换功能。如果不使用指针,代码如下:
#include
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int a = 3,b = 4;
printf(“交换前a=%d,b=%d\n”,a,b);
swap(a,b);
printf(“交換后a=%d,b=%d\n”,a,b);
}
上述代码运行后发现交换前和交换后a和b的值没有变,当普通变量作函数参数的时候,如果不用return返回值,main函数中的变量的值是不会变化的。为了真正实现变量a和b的值交换,使用指针重构上述代码:
#include
void swap(int x,int y)
{
int temp;
temp = x;
x = y;
y = temp;
}
void main()
{
int a = 3,b = 4;
printf(“交换前a=%d,b=%d\n”,a,b);
swap(a,b);
printf(“交换后a=%d,b=%d\n”,a,b);
}
该程序运行结果是:交换后a=4,b=3,实现了a和b真正的交换,由此可见使用指针作为函数参数可以得到多个改变的值。
3 结语
通过指针学习必要性分析,发现指针的确有很多不可替代的优势,比如可以提高程序执行效率、程序运行过程中动态开辟内存空间等,因此指针在C语言课程体系中有这不可替代的地位。作为专业教师,不能因为学生学习指针困难比较大而轻易选择不讲或者减少学习内容,必须结合班情、学情,精心设计教学过程,帮助学生更好地学习指针。
参考文献:
[1]谭浩强.C程序设计[M].清华大学出版社.
[2]李霞.C语言指针的应用[J].科技创新导报,2009(4):21-23.
[3]刘变莲.C语言指针再议[J].电脑知识与技术,2019(18):265-267.
作者简介:曹雁(1982-),女,甘肃天水人,硕士研究生,主要研究软件工程、视频编码。