c语言程序设计第章善于使用指针.ppt_第1页
c语言程序设计第章善于使用指针.ppt_第2页
c语言程序设计第章善于使用指针.ppt_第3页
c语言程序设计第章善于使用指针.ppt_第4页
c语言程序设计第章善于使用指针.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第8章善于使用指针,8.1什么是指针8.2指针变量8.3通过指针引用数组8.4通过指针引用字符串,8.1什么是指针,1指针是C语言的精华(灵魂)掌握指针的应用,可以使程序简洁、紧凑、高效。指针是内存单元的地址(1)定义变量分配存储单元。(2)存储单元包含若干字节。(3)每个字节都有一个编号,即地址。(4)单元的地址是首字节的地址,即变量的地址。(5)地址形象化地成为“指针”,指针即地址。(6)变量的地址即变量的指针,指针指向该变量单元。(7)将变量的地址存放到一个变量中,此变量称指针变量。,8.2指针变量,8.2.1指针变量的定义、初始化和引用1定义:inta,b,*p,*q;charch,*r;一般式:基类型*指针变量名;2定义指针变量时,可同时初始化:inta,b,*p=注:指针变量只能存放地址,并且必须是与指针基类型相同类型的变量的地址,不能将一个整数赋给指针变量。,(2)通过指针变量引用指针变量所指的变量例如:inta,b,*p,*q;p=以八进制的数的形式输出指针变量p、q的值。,例8.2(p214)输入a,b两个整数,按先大后小顺序输出。设计算法:使用指针,不交换两个整型变量的值,而是交换指针变量的值。编程序:#includevoidmain()inta,b,*p,*p1,*p2;p1=,8.2.2指针变量作为函数参数同其他变量一样,指针变量也可以作函数的参数,作用是将一个变量的地址传送到另一个函数中。例8.3(p215)用函数实现将两个整数交换,然后在main函数中输出交换后的变量值。#includevoidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;voidmain()inta,b,*q1=,讨论:下列3个函数是否能完成交换两个变量的值?为什么?(1)voidswap(intx,inty)inttemp;temp=x;x=y;y=temp;(2)voidswap(int*p1,int*p2)int*temp;*temp=*p1;*p1=*p2;*p2=temp;(3)voidswap(int*p1,int*p2)int*temp;temp=p1;p1=p2;p2=temp;结论:用指针作函数的参数,可以将多个值带回到主调函数,相当有多个返回值。,8.3通过指针引用数组,8.3.1数组元素的指针数组中的每个元素同变量一样,都有相应的地址,即为数组元素的指针,也可以将此地址放到一个指针变量中。例如:inta10,*p;p=*p=20;/*同a3=20*/注意:数组名是地址常量,是数组的首地址,亦是数组中首元素的地址,即元素a0的地址。,8.3.2通过指针引用数组元素引进指针概念后,引用一个数组元素可以有2种方法:(1)下标法:即数组名加下标,如ai形式。(2)指针法:即地址法,如*(a+i)同ai一样。例8.6(p221)用不同的方法输出整数数组的元素值。#includevoidmain()inti,j,t,a20,*p=a;for(i=0;i10;i+)scanf(“%d”,for(i=0;i=0;p-)printf(“%4d”,*p);printf(“n”);/*分析下列方法正确否?*/for(i=0;i10;i+)printf(“%4d”,*(a+);printf(“n”);总结:元素:ai、*(a+i)、*(p+i)、pi指针:sqrt(array,10);/*也可以写成sqrt(p,10);*/定义函数中,a是形参数组名,相当是指针变量,所以将函数首部写成:voidsqrt(int*a,intn)是一样的。调用函数时,把实参数组名array(指针常量)传递给a,此时a和array指向同一个数组,因此在对形参a数组排序时,等于直接在实参数组array上完成。直接改变了数组元素值。用数组名作参数可以有4种不同的形式,用数组名作参数可以有4种不同的形式:形参实参数组名数组名指针变量数组名数组名指针变量指针变量指针变量注意:前面介绍过,用指针作函数的参数,可以将多个值带回到主调函数,相当有多个返回值。数组名是指针,因此在对形参数组进行改变时,等于直接在实参数组上完成,相当形参数组的所有值都返回给实参数组。例8.9(p228)用指针和函数完成选择法排序。,8.4通过指针引用字符串,数组元素可以作为函数的参数,其用法与变量相同;数组名也可以作为函数的参数,传递的是数组首元素的地址。8.4.1数组元素作函数参数数组元素可以作为调用函数时的实参,传值给形参。数组元素不能作为函数的形参。例如:inta10;x=max(a1,a2);/*求元素a1、a2中大的*/intmax(intx,inty)不能写成:intmax(inta1,inta2)例7.6(P185),7.4.2数组名作函数参数数组名也可以作为函数调用时的实参,传递的是数组首元素的地址(即数组的首地址),不是将数组中的所有元素传递给形参。此时,对应的形参应当是数组名或指针变量(见第8章)。例7.7(P186)例7.8(P188)#includevoidmain()floataverage(floatarray);/*函数原型*/floatscroe10,aver);aver=average(score);/*调用函数,数组名为实参*/floataverage(floatarray)/*数组名为形参*/,例7.9(P189)用一个函数实现选择法对10个数排序。#includevoidsort(inta,intn)/*定义函数,数组名为形参*/inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(ajak)k=j;t=ai;ai=ak;ak=t;voidmain()inta10=12,6,3,7,4,9,13,2,10,8;sort(a,10);/*调用函数,数组名为实参*/,7.5变量的作用域和生存期,7.5.1变量的作用域局部变量和全局变量变量的作用域亦称有效范围。若程序中只包含一个main函数,则在函数中定义的变量在整个函数中都有效。当一个程序中包含多个函数时,在A函数中定义的变量在B函数中能否使用?这就是作用域问题。1局部变量在函数中定义的变量,只在本函数中有效,成为局部变量或内部变量。作用域只为本函数内。注:(1)不同函数中的局部变量可以使用相同的名字,他们有各自的有效范围,互不影响。(2)main函数中定义的变量也是局部变量。(3)函数的形参也是局部变量,函数外不能引用。(2)复合语句中可以定义变量,只在本语句中有效。,2全局变量一个程序包含多个文件,一个文件可以包含多个函数。在函数外定义的变量是外部变量或全局变量。有效范围为从定义的位置开始,到文件的结束。当一个文件中全局变量与局部变量重名时,在局部变量的有效范围内,全局变量被“屏蔽”起来,即不起作用。当局部变量出了有效范围后,全局变量继续有效。例7.10请看下列程序的输出结果。intm=13;intfun2(intx,inty)intm=3;return(x*y-m);voidmain()inta=7,b=5;printf(%dn“,fun2(a,b)/m);,7.5.2变量的存储方式和生存期除了作用域以外,变量还有一个重要的属性:生存期,即变量的存在时间。有些变量在程序运行的整个过程中都存在,而有些变量只在调用函数时才临时分配存储单元,函数调用结束马上就释放了,变量不再存在。即变量分为:静态存储方式和动态存储方式两种,亦称存储类别。由此可知,变量有两个属性:数据类型和存储类别。C语言中有4种存储类别:1auto自动变量前面用过的函数中,定义的形参和局部变量都是自动变量,存储类别定义的关键字auto省略,属于动态存储方式。有效范围和生存期均为本函数。2static静态变量函数中定义的局部变量静态变量,属于静态存储方式。有效范围为本函数,生存期为整个程序。,例7.12分别求出15的阶乘值,并输出。(p196)#includeintfac(intn)staticintf=1;/*f为静态局部变量*/f=f*n;return(f);voidmain()inti;for(i=1;i=5;i+)printf(“%d!=%dn”,i,fac(i);注:静态局部变量“f”的有效范围只限于函数fac,但是生存期是整个程序,即

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论