资源描述:
《对c语言指针教学问题的探究》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、对C语言指针教学问题的探究摘要:本文讨论了C语言中指针的各种应用形式,认真分析了指针在数组、函数和动态内存分配等方面应用的特点和优点,对如何学好和掌握C语言的指针有十分重要的指导意义。
关键词:指针;指针变量;数组;函数;动态内存分配
中图分类号:G642文献标识码:A
1引言
指针是C语言中一种特殊的数据类型,运用指针编程是C语言最主要的风格之一。利用指针变量可以访问各种类型的数据;能动态地分配内存空间;能很方便地使用数组和字符串;并能
2、像汇编语言一样处理内存地址,编出精练而高效的程序。但是,大部分学生对指针的理解和应用还是感到困惑,特别是什么场合用到什么类型的指针变量,应用指针变量应注意哪些问题等。本文对指针应用中的一些问题进行了梳理,以利于学生掌握指针的应用。
2数组中指针的应用
2.1使用指针引用数组元素的优点
对数组元素既可以用下标a[i]的方式引用,也可以用指针变量*p的方式引用。应该说,下标方式能对数组进行随机访问,指针变量却做不到这一点。但是,引入指针的主要目的是为了
3、提高对数组元素访问的速度。
在C语言中,数组中每一维下标的下界定义为0。对一维数组,设a[i]的存储地址为Loc(a[i]),每个数据元素占d个存储地址,则第i个数据元素的地址为
Loc(a[i])=Loc(a[0])+i*d(1)
对二维数组a[m][n],a[m][n]的存储地址是:
Loc(a[i][j])=Loc(a[0][0])+(i*n+j)*d(2)
实际上,对数组元素的引用,都要先计算数组元素的地址,才能对指定单元进行操作。显然,一维数
4、组中的地址要进行1次乘法和1次加法运算;二维数组中的地址则要进行2次乘法和2次加法运算。如果用指针变量p指向数组,连续对数组元素进行引用,可用p++和p--来移动指针。每次的引用地址只须进行简单的加法运算,引用数组元素的速度比使用数组下标要快得多。表1是在IBM-R40上使用下标和指针两种不同方式对10000个元素进行10000次访问的时间比较。
从测试结果看,随着数组维数的增加,使用指针方式访问数组的速度基本不变,但下标方式的访问速度明显减慢。
2.2动态数组的应用
在
5、C语言中,数组一般都是静态的。数组已经定义,所占用的内存空间就一直被占用,直到该函数退出时为
止。但如果使用指针变量,就可以实现需要时给数组分配内存,不需要时释放内存,可节约大量的内存空间。下面的程序就是使用了指针变量,使用动态数组的一个例子。
typedefstruct
{inta[MAXSIZE];
}A;
main()
{inti;
A*p;
p=(A*)malloc(sizeof(A));/
6、*动态分配内存*/
…………
free(p);/*释放内存*/
}
3函数参数中指针的应用
在C语言中,函数的形参是局部变量。实参和形参变量间的传递是值传递,即将实参的值传递给形参变量。形参在函数中如何变化,并不改变实参的值,我们称之为单向传递。这种参数的单向传递减少了函数之间的耦合性,增加了其内聚性,有利于结构化编程。但是,如果调用函数想从被调函数中得到一个以上的返回值,就比较困难。当然,通过全局变量也能实现,但过多的使用全局
7、变量又增加了函数之间的耦合性,不利于结构化编程。如果实参和形参都使用指针变量,就可达到此目的。下面的程序就是使用指针变量实现两个变量值交换的例子。
intswap(int*p1,int*p2)
{inttemp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
main()
{
inta,b;
int*pointer_1,*pointer_2;
scanf("%d,%
8、d",&a,&b);
pointer_1=&a;pointer_2=&b;
if(a printf("%d,%d",a,b);
}
需要说明的是:
(1)实参和形参之间传递的仍然是值,但该值不是变量的值,而是变量的地址,如图1所示。此时,实参和形参都指向了同一变量,对形参变量所指变量值的改变也必然改变实参变量的值,如图