C语言指针教学的探讨

来源 :中国科教创新导刊 | 被引量 : 0次 | 上传用户:svetcn
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要:指针是C语言中重要的知识点,同时也是教学难点。本文对C语言中的指针教学进行了探索和研究,提出从概念、类型、指针指向等多个方面理解和把握指针,并在教学中获得了一定的教学效果。
  关键词:指针指针变量类型间接访问
  中图分类号:G64 文献标识码:A 文章编号:1673-9795(2011)08(b)-0045-02
  
  Abstract:The pointer is very important in C language,which is also a difficulty in C teaching.The paper researched and employed the teaching of the pointer,proposed to teach the pointer by many aspects,such as the concept、type、point and so on,the practice improved that the teaching of the pointer achieved some effect.
  Key Words:pointer;pointer variable;type;indirect access;
  
  指针是C语言中的一个重要概念,也是C语言的一个重要特色[1]。应用指针编程,可以有效地表示复杂的数据结构,能够更加方便地使用数组和字符串,使得程序简洁高效。但是指针的应用非常灵活,而且有一定的难度,为此本文针对如何高效地学习指针做了探讨,以便更好地开展教学,帮助学生理解指针。
  
  1 掌握指针的概念
  理解指针,首先要从概念入手。指针是什么呢?首先要从地址说起:内存是一个连续的空间,一般依据字节大小划分为一个个存储单元,其中每个存储单元都有一个唯一的编号来标识这个空间,并且编号是连续的,这个编号称为地址,如0H、1H、2H等等。但是由于数据类型多种多样,因此数据占用的空间大小是有所不同的,比如一个普通整型数据需要占两个存储单元。假设其两个存储单元的地址为1001H和1002H,那么访问这个整型数据是用1001H地址还是1002H地址呢?答案是1001H,并且根据这个地址访问两个存储单元才能正确得到这个整型数据。这里的1001H不再仅仅是存储空间中的一个地址,更代表着一个整型变量的起始地址,而这个变量的地址就称作指针。就好比内存是一个很大的宾馆,宾馆里有很多的房间,每个房间都有编号,但是房间有大小,而这个房间的编号就是指针。因此指针不完全等同于地址,这个概念非常重要。那么通过运算得到某变量的地址以后,这个变量的地址存放在哪里呢?当然可以存放在存储空间里,所以应该开辟空间存放它。但是这个空间很特殊,它存放的不再仅仅是普通意义上的数学数字,而是某个变量的地址(即指针),因此把这个空间或者变量叫做指针变量。在C语言中,指针和指针变量是不同的概念,但是在应用的结果上两者没什么区别,所以在很多时候表述会混称,给学生造成误解,所以作为初学者一定要搞清楚两者之间的区别。概念是事物的本质,只有清楚地掌握了概念,学生才能开始应用。
  2 理解指针的类型
  掌握了指针的概念后,就可以定义指针并开始应用指针。应用时,学生首先必须要搞清楚指针也是有数据类型的。当指针变量中的内容是某变量的地址时,我们说该指针指向某变量。变量的数据类型有多种:整型、浮点型、字符型、数组、结构体等,其所占内存的空间大小不一样,所以当指针指向不同类型变量时,必然要求指针本身的类型也应有所不同。因此指针是有数据类型的,叫做基类型,并且要求指针的类型与指针所指向的类型是一一对应的,否则会出错。所以当定义了一个int*p指针变量时,其必然只能指向某个int变量;或者是有一个二维数组,其元素是多个长度为3的一维数组,要求定义一个指针指向这个一维数组整体时,需要定义成int(*p)[3]。扩展开来讲,指针可以指向任何类型,甚至包括函数。比如存在函数int max(int a,int b),为了使指针指向该函数,可以定义函数指针int(*f)(int a,int b)=max。所以指针所指向的类型是非常灵活的,只有正确的定义了指针的基类型,才能够熟练的应用指针进行间接访问。
  
  3 明确指针的内容
  明确了指针的类型以后,就可以给指针变量具体的指向,即给指针变量赋值。如果没有给指针变量赋值就进行操作,这个指针会随意地指向某空间,这样做“非常危险”。如果这个空间里面存放的正好是重要的数据,在指针的操作中,这个数据很有可能就会被破坏。例如以下代码经常在等级考试选择题中出现:
  inti,*p;
  scanf(“%d”,&i);
  scanf(“%d”,p);
  第一个输入语句给i从键盘赋值,第二个输入语句是给p所指向的空间赋值,但是此时的p没有指向,所以是错误的。如果代码第一行改成int i,*p=100呢?仍然是危险操作。因为这个地址的空间里面是否有重要内容,我们不能确定。而且在实际编程时,上述代码并不报语法错误,学生非常容易忽略,所以必须给学生多次强调。
  还有一种操作更加具有迷惑性,那就是在程序的执行过程中,迷失了指针的指向,从而造成错误操作,这点恰恰是学生的弱点,如下代码:
  #include;
  void main();
  {;
  int *p,i,a[10];
  p=a;
  for(i=0;i<10;i++);
  scanf(“%d”,p++);
  for(i=0;i<10;i++);
  {;
  printf(”%d”,*p);
  p++;
  };
  };
  这个例子要求先从键盘输入10个数据分别赋给数组的元素,然后输出数组元素。这段代码的陷阱在于输入操作完成以后,指针已经指向数组之外了,如果要达到题目要求,需要在第二个for语句前加上p=a。学生在做循环的时候,经常会因为循环次数多了而疏忽指针的走向,所以特别要给学生强调时时刻刻都必须要注意指针的指向。
  
  4 吃透指针的作用
  理解清楚概念,学会定义和赋值指针变量,学生也只能停留在解题的层次,在编程时常常想不到用指针变量,问题在于不明白为什么要间接引用变量。因此只有让学生理解间接访问的必要性,才能更好地掌握指针。这个重要的思想在函数中得到了体现,可设置如下代码:
  #include;
  voidmain();
  {;
  int a=5;
  函數调用;
  printf(“%d”,a);
  };
  要求定义一个无返回值函数,其作用是改变主调函数变量a的值。要在被调函数中访问变量a,唯一的办法就是通过间接访问,把函数的形参设置为指针变量,调用时实参是a的地址。如果把形参设置为普通变量,则不能达到此目的。通过这个例题学生就能体会到指针变量与之前学的普通变量的区别,体会到指针的间接访问作用。
  另外指针的间接访问在需要多个返回值时非常有效。通过函数调用得到一个返回值,很容易做到,当需要返回多个函数值时,return语句就不够使用。当然通过全局变量可以实现,但过多的使用全局变量又增加了函数之间的耦合性,不利于结构化编程[2]。例如定义一个函数求班级学生C语言、高等数学、英语三门成绩的最高分,并要求函数返回这三个最高分。此时的函数要求有多个返回值,怎么才能在主调函数中得到这三个值呢?return语句不能返回多个值,只能在函数中通过指针访问主调函数中的三个变量,从而把三门成绩间接地传送回去。函数参数起着传递数据的桥梁作用,所以行之有效的方法就是把形参设置成指针变量。只有明确了学习指针的目的,学生才能真正掌握指针的含义,在实际编程的时候才能根据不同的需求去设置指针。当然指针的优点有很多,可以动态地开辟空间,可以灵活地表示数据结构,这些都需要建立在学生已经熟练掌握指针意义的基础上。
  
  5 把握指针的细节
  想要全面地学习指针,还要注意把握细节知识,区分一些容易混淆的知识点。比如:int*p和*p(假设p是一个整型指针变量),第一个代码表示定义了一个整型指针变量p,而第二个代码表示指针变量p所指向的变量空间,这两者之间的区别非常重要,两个*的意义是不一样的,学生非常容易迷糊。*p++和++*p也比较容易混淆,其实学生只要根据运算符的优先级和结合性就不会出错。*和++优先级相同,结合性为从右至左。因此对于*p++,需要先做++运算符,然后做*运算符,但是由于++是后置自增,所以在实际运算时,p直接作为表达式的值参与*p运算,而后再做p+1赋给p的操作;而++*p,是先运算*p,然后把*p的结果做前置自增操作。类似于这样的细节要点,在等级考试中比较常见,因此需要给学生做详细的分析。
  
  6 结语
  指针是C语言中的一个重要知识点,也是一个特色,能否灵活的运用指针已经成为是否掌握C语言的考量指标。通过上述的探索和总结,指针的教学取得了一定的进步,学生也反映理解指针不难。但是本文只是从指针教学的角度做了总结,对指针的深入应用还需要后一步的探讨。
  
  参考文献
  [1] 谭浩强.C程序设计[M].北京:清华大学出版社,2009.
  [2] 赵忠孝、杨亚蕾.对C语言指针教学问题的探究[J].计算机教育,2009,2:77~81.
其他文献
近几年来,学校食物中毒事故时有发生,严重影响了学生的身心健康,已引起了卫生管理部门和社会的高度重视.为进一步了解我市大中专技工院校对<中华人民共和国食品卫生法>和<学
1临床资料2006年11月~2009年8月,我院对147例前列腺良性增生患者,选择经尿道等离子汽化电切术治疗。患者年龄53~86岁,平均年龄70岁。发生出血2例,膀胱痉挛15例,尿路感染7例。
目的探讨急性相蛋白(APP)与肺炎衣原体肺炎病情及预后的关系.方法检测23例肺炎原体患者(观察组)及11例正常人(对照组)空腹静脉血清APP,包括α1-酸性糖蛋白(α1-AG)、触珠蛋白
目的:分析微型钢板螺钉内固定治疗手部骨折的临床效果及应用价值。方法:选取本院2012年3月-2014年9月收治的96例手部骨折患者作为本次观察对象,根据固定方式不同,将96例患者随
随着城市化进程的逐渐发展,越来越多的高楼大厦矗立在城市的每一个角落,由于商业区和住宅区比较集中,用电和用火也相应地集中,建筑防火设计俨然成为当代社会一个重要的话题。
目的探讨妇科常见病患病率、主要病种及有关因素.方法对普查对象逐个询问病史,填写统一制订的体检表,常规进行妇科检查及辅助检查.结果2001年5月离退休妇女普查和2002年5月在
高职院校五年一贯制学生年龄偏小,思想道德、文化素质、心理素质等各方面有待加强。作为学生管理一线的工作者,要融入情感,耐心疏导,纠正认知偏差,帮助学生客观地认识自己的
2016年,在100多个国家部委、行业协会、省质监局、国家标准委直属全国标委会和国家技术标准创新基地筹建单位推荐的200余个申报项目中,共有10个项目经过层层评审被授予一等奖
节能减排是钢铁行业的一项难点工作,为适应当前的环保要求,烧结机头除尘器大部分采用四电场及以上形式,电除尘的工作主要依靠高压供电使气固分离,因此是钢厂的耗能大户,本文
介绍了某电厂2台超临界机组的概况,阐述了阀门伺服控制卡的工作原理以及其典型故障及处理方法,分析了故障产生的原因并针对不同故障采取了不同的应对措施,以保证该模件的正常