指针是C语言的重要概念和特色使用指针

上传人:痛*** 文档编号:243951588 上传时间:2024-10-01 格式:PPT 页数:40 大小:474KB
返回 下载 相关 举报
指针是C语言的重要概念和特色使用指针_第1页
第1页 / 共40页
指针是C语言的重要概念和特色使用指针_第2页
第2页 / 共40页
指针是C语言的重要概念和特色使用指针_第3页
第3页 / 共40页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第,9,章 指 针,指针是语言的重要概念和特色。使用指针,可以使程序更加简洁、紧凑、高效。,教学目的,:,掌握,指针,的概念,,指针变量,的概念、定义与应用,指向,1,维数组,(,字符串,),的指针变量应用,指针数组与,带参主函数,;,了解,返回,指针值的函数,等,。,10/1/2024,1,教学内容,:,9.1,指针和指针变量的概念,9.2*,指针变量的定义与应用,9.3*,1,维数组的指针与列指针变量,9.4,字符串的指针和指向字符串的指针变量,9.5,指针数组与主函数,main(),的参数,9.6,返回指针值的函数,本章要点,本章作业与上机实践,10/1/2024,2,9.1,*,指针和指针变量的概念,1,内存地址,内存中存储单元的,编号,。,(1),内存中拥有大量的存储单元,(1,字节,),。为了方便管理,必须为每一个存储单元编号,存储单元的“地址”。,每个存储单元,都有一个惟一的地址。,(2),在地址所标识的,存储单元,中,存放,数据,。,类比:住址,(,宿舍编号,),与人。,10/1/2024,3,2,变量地址,系统分配给变量的内存单元的,起始地址,。,假设有如下程序:,void main( ),int,num,;,scanf(%d, ,printf(num,=%dn, num);,且系统分配给变量,num,的,2,个存储单元为,3000,和,3001,,则,起始地址,3000,就是变量,num,在内存中的,地址,。,10/1/2024,4,3,变量值的存取,通过变量在内存中的,地址,进行,系统存取变量,num,的方式可以有两种:,3,3000,num,(1),直接访问,直接利用变量的地址进行存取,用变量名,num,查找符号表,(,编译程序建立,),,取出其起始地址,3000,;然后访问,num(,将数据送入,/,取出,),,如右图所示。,10/1/2024,5,(2),间接访问,通过另一变量访问,num,的值,语言规定:在程序中,可以定义一种特殊的变量,(,称为,指针变量,),,用来存放其它变量的地址。,假设:定义了,1,个指针变量,num_p,,它被分配到,4000,、,4001,单元,通过赋值语句“,num_p,=,num,;,”获得,num,的地址,3000,,如下图所示:,10/1/2024,6,通过指针变量,num_p,,存取变量,num,的过程如下:,首先找到指针变量,num_p,的地址,(4000),,取出其值,3000,(num,的地址,),; 然后存取,num,的值,(3),。,3000,3,3000,4000,num,num_p,10/1/2024,7,(3),两种访问方式的比较,类比,:某人甲,(,系统,),找某人乙,(,变量,),办事,甲直接去找乙办事,(,即,直接访问,),。,甲委托丙,(,指针变量,),去找乙办事。,10/1/2024,8,4,指针与指针变量,(1),指针,即地址,变量的,地址,称为该变量的,指针,。,(2),指针变量,专门用于存储其它,变量地址,的变量。,例如,变量,num_p,是一个指针变量,其值是变量,num,的地址。,返回,10/1/2024,9,9.2,*,指针变量的定义与应用,9.2.1,指针变量的定义与相关运算,案例,9.1,指针变量的定义与相关运算示例。,#include ,stdio.h,#include ,conio.h,void main( ),int,num_int,=12,*,p_int,;,float,num_f=3.14,*,p_f,;,char,num_ch,=p,*,p_ch,;,p_int,=,&,num_int,;,p_f,=,&,num_f;,p_ch,=,&,num_ch,;,指向,int,型数据的指针变量,p_int,使,p_int,指向变量,num_int,10/1/2024,10,printf(“num_int,=%d, *,p_int,=%dn”,num_int,*,p_int,);,printf(“num_f,=%4.2f, *p_f=%4.2fn”, num_f,*,p_f);,printf(“num_ch,=%c, *,p_ch,=%cn”,num_ch,*,p_ch,);,getch,(); ,程序运行结果:,num_int,=12, *,p_int,=12,num_f,=3.14, *,p_f,=3.14,num_ch,=p, *,p_ch,=p,访问,p_int,所指向的变量,10/1/2024,11,1,、,指针变量的定义,数据类型,*,指针变量,*,指针变量,2;,例如,,案例,9.1,中的语句:,int,num_int,=12,*,p_int,;,特别说明,:定义而未初始化的指针变量,(,例如,p_int,),是悬空的。,使用,悬空指针变量,,很容易破坏系统,导致系统瘫痪。,指针变量的定义标识符,10/1/2024,12,2,、,取地址运算,:,变量名,例如,,案例,9.1,中的,&,num_int,、,&,num_f,、,&,num_ch,的结果,分别为对应变量的地址,(,num_int,、,num_f,、,num_ch,),。,注意,:,指针变量,只能,存放,相同数据类型变量的,地址,。,例如,,案例,9.1,中的指针变量,p_int,、,p_f,、,p_ch,,,只能接收,int,型、,float,型、,char,型变量的地址,否则出错。,10/1/2024,13,3,、,指针运算:,*,指针,变量名,*,p_int,、,*,p_f,、,*,p_ch,,,分别输出各自所指向的变量,num_int,、,num_f,、,num_ch,的值。,案例,9.2,使用指针变量求解:输入,2,个整数,按升序,(,从小到大排序,),输出。,10/1/2024,14,#include ,stdio.h,#include ,conio.h,void main(),int,num1, num2;,int,*,num1_p=,&,num1,*,num2_p=,&,num2,*,pointer;,printf(“Input,the first number: ”);,scanf(“%d,”,num1_p,);,printf(“Input,the second number: ”);,scanf(“%d,”,num2_p,);,printf(“num1=%d, num2=%dn”, num1, num2);,if(,*,num1_p ,*,num2_p )/*num1num2,:交换指针*,/, pointer= num1_p; num1_p= num2_p; num2_p=pointer; ,printf(“min,=%d, max=%dn”,*,num1_p,*,num2_p);,getch,();,悬空指针,使,num1_p,指向,num1,本身是地址,不能再加,&,。,10/1/2024,15,算法思路,:,交换,指针变量,num1_p,、,num2_p,的值,而不是变量,num1,和,num2,的值,(,保持原值,),,最后通过指针变量输出处理结果。,假设输入的数据为,9,和,6,,则,指针变量,num1_p,和,num2_p,交换前后的指向,如下图所示:,10/1/2024,16,9.2.2,指针变量作函数参数,1,、指针变量:,形参,+,实参,。,2,、指针变量作实参时,是,地址传递,,即将指针变量的值,(,一个地址,),,传递给被调用函数的形参,(,必须是一个指针变量,),。,10/1/2024,17,案例,9.3,使用函数调用方式改写,案例,9.2,,要求函数参数为指针变量。,#include ,stdio.h,#include ,conio.h,void exchange(,int,*,pointer1,int,*,pointer2 ),int,temp;,temp=,*,pointer1;,*,pointer1=,*,pointer2;,*,pointer2=temp;,10/1/2024,18,void main(),int,num1, num2;,int,*,num1_p=,&,num1,*,num2_p=,&,num2;,printf(“Input,the first number: ”);,scanf(“%d,”,num1_p,);,printf(“Input,the second number: ”);,scanf(“%d,”,num2_p,);,printf(“num1=%d, num2=%dn”, num1, num2);,if(,*num1_p,*num2_p,) /* num1num2*/,exchange(,num1_p, num2_p,); /*,指针变量作实参*,/,printf(“min,=%d, max=%dn”, num1, num2);,getch,();,10/1/2024,19,算法思路,:,通过,指针变量,num1_p,、,num2_p,,,交换它们所指向的,变量,num1,和,num2,的值,最后通过变量,num1,和,num2,输出结果。,假设输入的数据为,9,和,6,,则调用函数,exchange(),之前、之时、结束时和结束后的情况,如图,9-4,所示:,10/1/2024,20,10/1/2024,21,形参指针变量,pointer1,(num1),和,pointer2,(num2),,,在函数调用,开始,时才,分配,存储空间,函数调用,结束,后立即被,释放,。,结论,:,地址传递,时,,形参,指针变量不可改变,实参,指针变量,但可以改变它所指向的,变量的值,,通过不变的实参指针变量将变化的值保留下来。,返回,10/1/2024,22,9.3,*,1,维数组的指针与列指针变量,9.3.1,预备知识,9.3.2,使用列指针变量引用数组的元素,9.3.3,数组作函数参数,返回,10/1/2024,23,9.3.1,预备知识,1,、基本概念,数组指针,数组,在内存中的,起始地址,,用,数组名,表示。,数组,元素指针,数组元素,在内存中的,起始地址,。,10/1/2024,24,2,、指向数组的指针变量的定义,int,array10, *pointer,= array (,或,&array0),;,int,array10, *pointer;,pointer,array;,数组名,数组在内存中的起始地址,(,与第,1,个元素的地址相同,),10/1/2024,25,(1),pointer + i,和,array + i,都是指针,均指向元素,arrayi,,即:,pointer + i = array + i = &,arrayi,。,(2,),*(,pointer + i,),和*,( array + i ),均访问元素,arrayi,。,(3),指向数组的指针变量,可以当作数组名用。,例如,,pointer,i,*(pointer+i),。,注,:,pointer + 1,使指针指向数组的,下一个元素,,而不是内存下一个存储单元。,10/1/2024,26,3,、数组元素的引用方法,(1),下标法:,arrayi,,直观。,(2),指针法:*,pointer,,目标程序占用内存少、速度快。,返回,10/1/2024,27,案例,9.5,使用指向数组的指针变量来访问数组元素。,#include ,stdio.h,#include ,conio.h,void main(),int,array10,*pointer,=,array, i;,printf(“Input,10 numbers: ”);,for,(i=0; i10; i+),scanf(“%d,”,pointer+i,) ;,printf(“array10: ”);,for,(i=0; i10; i+),printf(“%d,”,*(pointer+i),) ;,printf(“n,”);,getch,();,使用指向数组的指针变量输入。,使用指向数组的指针变量输出,9.3.2,使用列指针变量引用,1,维数组的元素,10/1/2024,28,1,指向数组的指针变量,可以指向数组后面的内存单元,虽然没有实际意义。,例如,,*,(,pointer+10),,程序照样运行。,2,对指向数组的指针变量,(,px,和,py,),,,进行,算术,运算和,关系,运算的含义:,10/1/2024,29,(1),算术,运算:,px, n,:,将指针从当前位置向前,(+),或回退,(-),n,个元素,(,不是,n,个字节,),。,px+/+px,和,px-/-px,是,pxn,的特例,(n=1),。,px,-,py,:,两指针之间的,元素个数,,不是地址之差。,10/1/2024,30,(2),关系,运算:两个指针所指地址的前后关系:前者为小,后者为大。,例如,如果指针,px,所指地址在指针,py,所指地址之前,则,px,=,a&c,=,A&c,=Z ? 1 : 0);,10/1/2024,34,2,、,数组名作为函数的形参和实参,数组名,作实参时,传递的是,数组指针,,,属于,地址传递,,对应的,形参,必须是同一数据类型的数组名,(,指针变量,),。,案例,已知某个学生,5,门课程的成绩,求平均成绩。,10/1/2024,35,#include ,stdio.h,#include ,conio.h,float aver(,float a ,int,n);,void,main( void ), float score5 = 70,75,80,85,90,;,printf(average,= %5.2fn,aver,(,score, 5 ) ),;,float aver(,float a ,int,n), float sum = a0,;,int,i=1,;,for(,;,i= a) & (,stri, = z) )/*,小写字母*,/,stri, -= 32;/*,转换成大写*,/,思考:,1,、程序输出结果?,2,、,LwrToUpr,(,char,str, ,),可以改为,LwrToUpr,(,char *,str,),吗?函数体如何修改?函数体是否必须修改?,10/1/2024,39,调用,开始,时:,0,.,e,g,a,u,g,n,a,L,C,string,str,调用,结束,时:,0,.,E,G,A,U,G,N,A,L,C,str,string,返回,10/1/2024,40,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!