指针在《C程序设计》教学中的应用研究
2020-11-24李翠莲
李翠莲
(吕梁学院离石师范分校, 山西 离石 033000)
指针在《C程序设计》课程教学中是必须掌握的重点教学内容之一,是C程序设计的精华[1],但也是应用广泛、使用灵活、功能强大、掌握难度大、最容易出现错误的知识点。熟练掌握并能够准确应用指针进行程序设计是驾驭C程序设计的标志,在进行程序设计时巧妙的利用指针能够设计出高效、简洁的程序,对问题的处理可达到事半功倍的效果。
一、指针的定义
(一)数组的使用
数组是具有相同数据类型的数据依次存储在连续的内存空间中,在编写程序时可以使用循环算法遍历处理数组中的每个元素,使编制的程序简洁、高效[3],数组的本质是数据存储在连续的存储空间中,利用连续地址的特点访问存储空间,编程时只要知道存储空间的首地址和数据个数,编程时访问第一个数据后,利用地址变量=首地址±i访问连续的存储空间,从而可以利用循环算法遍历数组中的每个元素。如下算法实现给100个连续的存储空间存放02、12、22……992共100个数,代码简洁、高效:
int GradeArr[100];
for(int i = 0; i < 100; i++)
GradeArr[i] = i * i;
(二)指针的定义
在计算机科学技术中,指针(Pointer)是程序设计语言中的一种数据类型,它利用地址值直接指向(points to)计算机内存中的一个存储单元,通过地址直接指向存储单元(即变量单元)中的数据故称为“指针”。C程序设计利用指针取代汇编语言或机器语言直接访问存储单元,在编写系统软件和硬件控制程序中有非常强大的功能,所以指针是C语言的精华,利用指针可以操控硬件,只要知变量的首地址和变量的个数,就可以用循环算法遍历其中的数据(有关指针的定义使用等知识点略)。
二、利用指针访问变量中的数据
(一)整形变量循环算法访问
分析一组变量:int a = 3,b = 8 ,c = 51 ,d = 88,e = 125;其各变量的地址值连续并相差值为4,如表1,用“a地址值-i”算法实现遍历5个变量值,从表可以看出C语言在连续声明变量时采用从右到左以压栈的方式开辟存储空间,变量地址值内存中是连续的,可以利用连续的特点采用循环算法访问a、b、c、d、e五个变量中的值,如下一个循环语句等价于5条printf语句,运行结果如图1:
图1 连续整形变量运行结果
表1 a、b、c、d、e变量的地址
int a = 3,b = 8 ,c = 51 ,d = 88,e = 125;
for(int i = 0;i < 5;i++)
printf("%c = %d ",97 + i,*(&a - i));∥“&a - i”指针
(二)字符型变量循环算法访问
上述5个字符变量声明后,用指针连续访问的核心算法为:&a - i * 4(其中i=0,1,2,3,4),实现语句如下:
char a = ‘A’,b = ‘B’ ,c = ‘C’ ,d = ‘D’,e = ‘E’;
for(int i = 0;i < 5;i++)
printf("%c = %d ",97 + i,*(&a - i * 4));∥“&a - i *4”指针
上述程序运行结果如图2。
图2 连续字符型变量运行结果
三、利用指针实现函数值的多值返回
计算机中函数是模块化程序设计基础,它是一段固定程序,也称其为子程序,能实现特定功能的算法。函数的最主要特征是只有一个入口和一个出口,入口即函数所带的各个参数,把函数的参数值传递到子程序中,作为算法处理的对象,出口即函数经过运算后的结果返回到主调用函数处,程序语言规定一个函数只能返回0或1个返回值。在实际问题中有时要求函数算法结果影响主调函数的几个值,如对整形数组中数据进行排序,实质要求返回多个值与函数规定相矛盾,巧妙利用数组的首地址和数组元素个数作为函数的参数可以实现,该方法实质是采用指针来实现。
利用变量指针作为函数参数可以实现主调函数多变量的数据排序,如对于a = 3,b =51 ,c = 8三个变量通过函数实现a、b、c变量值从大到小排序,用传统函数传递数值参数无法实现,而巧妙利用指针该功能很容易实现。实现代码如下,排序结果如图2:
#include
void ThreeChange(int *,int *,int *);∥声明排序函数ThreeChange,函数参数为指针
void main()
{
int a = 3,b =51 ,c = 8;
ThreeChange(&a,&b,&c);∥调用ThreeChange函数
printf(" a = %d b = %d c = %d ",a,b,c);∥输出a、b、c的值
}
∥排序函数ThreeChange的定义,接收3个指针变量
void ThreeChange(int * x,int * y,int * z)
{
int temp;
∥实现a的值存储最大值
if(*x < *y )
{
if(*y < *z)
{
temp = *x;
*x = *z;
*z = temp;
}
else
{
temp = *x;
*x = *y;
*y = temp;
}
}
∥实现y中存储最大值
if(*y < *z)
{
temp = *y;
*y = *z;
*z = temp;
}
}
四、结语
在C语言中,指针是其中的精髓,也是掌握的难点,只要真正掌握并理解了指针,在程序设计教学中能够讲清讲透彻各知识点,在软件开发中,能够灵活利用指针编写特殊类型的算法,可以编制执行效率高的应用软件和系统软件,并且充分利用指针操作硬件的特性,可以开发硬件控制系统和实时操作要求高的系统。本文只列举了指针在整型变量、字符型变量、函数中的一些应用,指针在字符串处理、函数、结构体、文件操作、堆栈等中也有很强的应用,期望本文的知识总结在教学中起到灵活利用指针的作用,在编写程序时灵活利用指针实现高效的程序。
图3 a、b、c变量值排序结果