对C语言指针教学问题的探究..doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
对C语言指针教学问题的探究.

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

文档评论(0)

sa1fs5g1xc1I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档