(1.9)--第9章 指针C语言程序设计.ppt

上传人:奉*** 文档编号:96452254 上传时间:2023-11-29 格式:PPT 页数:26 大小:347.03KB
返回 下载 相关 举报
(1.9)--第9章 指针C语言程序设计.ppt_第1页
第1页 / 共26页
(1.9)--第9章 指针C语言程序设计.ppt_第2页
第2页 / 共26页
点击查看更多>>
资源描述

《(1.9)--第9章 指针C语言程序设计.ppt》由会员分享,可在线阅读,更多相关《(1.9)--第9章 指针C语言程序设计.ppt(26页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第9章章 指针指针1 1指针指针(Pointer)是C语言中一个变量的地址,根据这个地址可以直接找到相应变量的存储单元。将地址形象化的称为“指针”。指针是C语言的灵魂,指针的自由和灵活:使程序简洁、紧凑、高效;有效地表示复杂的数据结构;动态分配内存 得到多于一个的函数返回值;能直接处理内存地址,从而编出精练而高效的程序。学习目标:21.理解指针的概念理解指针的概念3.掌握指针与数组、字符串之间的联系4.掌握动态内存分配与释放方法5.掌握指针型参数和指针型函数的定义和使用2.掌握指针变量的定义与引用方法6.掌握函数型指针的定义和使用本章重点内容:指针与指针变量1指针与数组24指针与函数3指针与

2、字符串3void main()int a,b,c;scanf(%d,%d,&a,&b);printf(&a=%d,&b=%dn,&a,&b);printf(&c=%dn,&c);c=a+b;printf(c=%dn,c);4 41.指针的概念指针的概念12存储单元地址指明变量临时占用内存单元的位置,形象地称为指针,存放地址的变量称为指针变量。3 abc 124505212450481245044内存存储单元变量宾馆房间宾客9.1指针与指针变量52.指针变量的定义指针变量的定义数据类型 *指针变量名1,*指针变量名2,,*指针变量名n;指指针变量量说明符明符整型指针变量:pointer_a,po

3、inter_b字符型指针变量:pointer_ch单精度指针变量:pointer_f双精度指针变量:pointer_dstrurt clock int hour;int minute;int second;int *pointer_a,*pointer_b,a,b;char ch,*pointer_ch;float f,g,*pointer_f;double *pointer_d,d,r;int *pointer_array10;struct clock *pointer_clock;一维整型指针数组:pointer_array结构体指针变量:pointer_clock9.1指针与指针变量10

4、00Apointer_array03.指针变量的初始化指针变量的初始化9.1指针与指针变量6int b=1000,*pointer_a=&a,*pointer_b;pointer_b=pointer_a;int *pointer_array10=0;char ch=A,*pointer_ch;pointer_ch=&ch;12450521245044NULLchpointer_apointer_chapointer_a、pointer_ch、pointer_array等所有类型的指针变量,占4个字节存储空间,类型不同的指针变量之间不能直接赋值,可以通过类型转化赋值。初始化建立指针变量与目标之间

5、的指向关系。pointer_a=1245052();pointer_a=(int*)1245056()79.1指针与指针变量4.指针变量的运算指针变量的运算1)加、减运算。)加、减运算。char *pointer_ch;double*pointer_d;int *pointer_a;pointer_a-1pointer_apointer_a+1pointer_a+2pointer_dpointer_d+1pointer_ch-4pointer_chpointer_ch+4pointer_ch+8指针变量的加、减运算与指针变量的加、减运算与指针变量类型指针变量类型相关,指针变量相关,指针变量p+

6、np+n的含的含义是义是p+np+n*sizeof(sizeof(指针变量类型指针变量类型)。9.1指针与指针变量2)*运算运算*指针表达式运算的含义是取以该表达式的值为地址的内存空间的值。char ch,*pointer_ch;pointer_ch=&ch;ch=A;*pointer_ch=B;*pointer_ch 是以1245044为地址的存储空间的值,而1245044的存储空间是ch,因此ch=*pointer_ch。ch的地址用&ch表示是1245044,ch的地址存放在指针变量pointer_ch中,pointer_ch的值是1245044,因此&ch=pointer_ch。chp

7、ointer_chA1245044运算符说明符B*(&ch)=*(pointer_ch)=ch,&(*pointer_ch)=&ch=pointer_ch,&和*互为逆运算。8void main()void*p;int a=100,*pa=&a;double d=78.56,*pd=&d;p=pa;printf(%dn,*(int*)p);pa=(int*)pd;printf(%dn,*pa);9.1指针与指针变量3)关系)关系运算运算4)强制类型转换)强制类型转换发生在指向相同数据类型的指针之间。其中:、=、判断两个指针指向的数据位置的前后关系,=、!=判断两个指针是否指向同一个数据。if(

8、p1=p2)无论何种类型的指针存储大小均为为4个字节(程序总的寻址空间是232,即4GB。4个字节表示指针能指向任何内存地址空间)。强制类型转换是将指针由一种类型转换为类一种类型,其值大小不变。for(;p1=p2;p1+)int a10,*p1=a,*p2=&a9;/void类型万能指针,可以无须类型转换与其它任意类型指针之间相互赋值99.2指针与数组101.数组的指针数组的指针数组的指针就是数组在内存中占用的一片连续存储单元的起始地址。而数组在内存中的起始地址就是数组变量名,也是数组中第一个元素在内存中的地址。int a9;数组名:aa0a1a2a3a4a5a6a7a8aa+1a+2a+3

9、a+4a+5a+6a+7a+8&a0&a1&a2&a3&a4&a5&a6&a7&a8数组的指针(地址):a 或&a0for(i=0;i9;i+)scanf(“%d”,&ai);for(i=0;i9;i+)scanf(“%d”,a+i);&a0 a&ai a+i9.2指针与数组112.指向一维数组的指针变量指向一维数组的指针变量将数组的将数组的起始地址起始地址赋给相应类型指针变量,该指针变量就称为赋给相应类型指针变量,该指针变量就称为指向数组的指针变量。int int a a9=1,2,3,4,5,6,7,8,9,*9=1,2,3,4,5,6,7,8,9,*papa=a a;pa papa+pa

10、+pa+pa+pa+pa+pa+pa+数组元素地址 aa+1a+2a+3a+4a+5a+6a+7a+8&a0&a11&a2&a3&a4&a5&a6&a7&a8*pa*pa+*pa+*pa+*pa+*pa+*pa+*pa+*pa+数组元素*a*(a+1)*(a+2)*(a+3)*(a+4)*(a+5)*(a+6)*(a+7)*(a+8)a0a1a2a3a4a5a6a7a8指针变量地址常量a0a1a2a3a4a5a6a7a8200020042008201220162020202420282032a9.2指针与数组12例1:使用下标变量、地址常量、指针变量表示输入一列整数并求和。int a9,*pa

11、,total,i;for(i=0;i9;i+)scanf(%d,&ai);for(total=0,i=0;i9;i+)total+=ai;printf(a0+.+a8=%dn,total);for(i=0;i9;i+)scanf(%d,a+i);for(total=0,i=0;i9;i+)total+=*(a+i);printf(a0+.+a8=%dn,total);for(pa=a,i=0;i9;i+)scanf(%d,&pai);for(total=0,i=0;i9;i+)total+=pai;printf(a0+.+a8=%dn,total);for(pa=a,i=0;i9;i+)sca

12、nf(%d,pa+i);for(total=0,i=0;i9;i+)total+=*(pa+i);printf(a0+.+a8=%dn,total);for(pa=a;paa+9;pa+)scanf(%d,pa);for(total=0,pa=a;paa+9;pa+)total+=*pa;printf(a0+.+a8=%dn,total);pa=apa=a9.2指针与数组133.指向二维数组的指针变量指向二维数组的指针变量数组指针变量数组指针变量(1)二维数组的行地址与列地址int a34;a0a1a2a+0a+1a+2a10a11a12a13a20a21a22a23a00a01a02a03二

13、维数组a一维数组a0一维数组a1一维数组a2a0+0a0+1a0+2a0+3a1+0a1+1a1+2a1+3a2+0a2+1a2+2a2+3列地址行地址9.2指针与数组14二维数组地址:a二维数组第一行地址:a+0二维数组第二行地址:a+1a1第一列元素地址:a1+0一维数组a0的地址(列):a0一维数组a1的地址(列):a1二维数组第三行地址:a+2a0第一列元素地址:a0+0a0的第一列元素的值:a00a1的第一列元素的值:a10a2第一列元素地址:a2+0一维数组a2的地址(列):a2a2的第一列元素的值:a20*(a+0)*(a0+0)*(a1+0)*(a2+0)*(a+1)*(a+2

14、)9.2指针与数组15二维数组有行、列两个维度,从数组名取到元素的值要经过两次*运算,第一次由二维地址到行地址,第二次由行地址到列地址。a0a1a2aa+1a+2a00a01a02a0320002016203220002004a10a11a12a13a20a21a22a232020201620322036*a*a0形式含义a二维数组首地址a+0、a0第1行地址*a、*(a+0)、a0、&a00第1行第1列元素地址a1+2、&a12、*(a+1)+2第2行第3列元素地址*(a2+3)、a23、*(*(a+2)+3)第3行第4列元素的值a+1、a1第2行地址9.2指针与数组16(2)指向二维数组列

15、地址(元素)的指针变量例2:使用指向元素的指针变量输出二维数组中各个元素的值。#include void main()int a34=1,2,3,4,5,6,7,8,9,10,11,12,*pa,i;pa=&a00;for(i=1;pa*(a+3);pa+,i+)printf(%2d,*pa);if(i%4=0)printf(n);初始化必须是二维数组列地址以int为存储单位9.2指针与数组17(3)指向二维数组行地址(一维数组)的行指针变量数据类型(*指针变量名)二维数组第二维长度表达式;#include void main()int a34=1,2,3,4,5,6,7,8,9,10,11,

16、12,i;int (*p)4;for(p=a ;pa+3;p+)for(i=0;i4;i+)printf(%2d,*(*p+i);printf(n);指向长度为一行4个int变量的行指针变量初始化行地址一行4个int为一个单位例3:使用指向行地址的指针变量输出二维数组中各个元素的值。9.2指针与数组4.指向数组的指针做函数的参数指向数组的指针做函数的参数18用指针变量做形参以接收实参数组名传递来的地址时,有两种办法:用指向数组元素的指针变量;用指向一维数组的指针变量。例4:一个班3名学生4门功课,计算每名学生的平均分,统计输出不及格门次。void average(float(*fp)5,int

17、 n)float ave;int i;float(*fp_end)5=fp+3;for(;fpfp_end;fp+)for(ave=0,i=0;i4;i+)ave+=*(*fp+i);*(*fp+4)=ave/4;int total(float*s,int n)int i,failnum=0;float*s_end=s+n;for(i=1;ss_end;s+,i+)if(i%5=0)/跳过均分 continue;if(*s60)failnum+;return failnum;void main()int i,j;float score35=65,67,70,60,0,80,87,90,81,0

18、,90,99,100,98,0;average(score,3);for(i=0;i3;i+)for(j=0;j5;j+)printf(%5.1f,scoreij);printf(n);printf(不及格门次=%dn,total(*score,15);9.3指针与字符串191.用字符指针处理字符串常量用字符指针处理字符串常量 char *str=“I love China!”;printf(“%sn”,str);str+=7;puts(str);char ch15=“I love China!”;printf(“%sn”,ch);puts(ch+7);char *str;str=“I lov

19、e China!”;str指向“I love China!”的首地址,可以用str来处理该字符串,str值也可以变化。ch为“I love China!”的首地址常量,同样可以用ch来处理该字符串,但ch的值不能改变。char ch15;ch=“I love China!”;ch+=7;str+=7;209.3指针与字符串2.野指针野指针指向无效内存目标的指针变量称为指向无效内存目标的指针变量称为“野指针野指针”。野指针可能会随意。野指针可能会随意乱指向某关键部位,因无意的修改而引起程序异常,甚至导致系统崩溃。乱指向某关键部位,因无意的修改而引起程序异常,甚至导致系统崩溃。解决办法解决办法:在

20、在指针变量被创建的同时要么设置为指针变量被创建的同时要么设置为NULLNULL,要么让它指,要么让它指向向合法的内存合法的内存。或者在。或者在freefree、deletedelete之后及时将指针变量之后及时将指针变量置为置为NULLNULL。(1)指针变量没有被初始化。char*p;scanf(%s,p);(2)指针变量被free或者delete之后,没有置为NULL char*p=(char*)malloc(100);strcpy(p,“hello”);free(p);/p 所指的内存被释放,但是p所指的地址仍然不变 if(p!=NULL)/没有起到防错作用 strcpy(p,“worl

21、d”);/出错#include#include#include void main()char*p=(char*)malloc(sizeof(char)*100);printf(指针p的地址是:%dn,p);strcpy(p,Hello);printf(%sn,p);free(p);printf(指针p的地址是:%dn,p);p=NULL;printf(指针p的地址是:%dn,p);1【例】利用字符指针数组对一组城市名进行升序排列。9.3指针与字符串#include#include#include#include void main()void main()int i,j,k;int i,j,

22、k;char*pcity char*pcity=Wuhan,Beijing,Shanghai,Tianjin,Guangzhou;=Wuhan,Beijing,Shanghai,Tianjin,Guangzhou;char*ptemp;char*ptemp;for(i=0;i4;i+)for(i=0;i4;i+)k=i;k=i;for(j=i+1;j5;j+)for(j=i+1;j 0)k=j;if(strcmp(pcityk,pcityj)0)k=j;if(k!=i)if(k!=i)ptemp=pcityi;ptemp=pcityi;pcityi=pcityk;pcityi=pcityk;p

23、cityk=ptemp;pcityk=ptemp;for(i=0;i5;i+)for(i=0;i5;i+)printf(%s ,pcityi);printf(%s ,pcityi);printf(n);printf(n);运行结果:运行结果:Beijing Guangzhou Shanghai Tianjin Wuhan21t&x&yxyab9.4指针与函数221.指针做函数的参数(地址型参数)指针做函数的参数(地址型参数)x=3,y=5x=5,y=3void swap(int*a,int*b)int t;t=*a;*a=*b;*b=t;void swap(int*a,int*b)int *t

24、;t=a;a=b;b=t;printf(“x=%d,y=%dn”,x,y);printf(“x=%d,y=%dn”,x,y);swap(&x,&y);5int x=3,y=5;x=3,y=5x=3,y=512335&x&yxyabt12333539.4指针与函数232.返回值为指针的函数返回值为指针的函数-指针函数指针函数C语言中,函数的返回值可以是整型、字符型、实型等类型,还可以是指针类型,即返回值为存储某种数据的内存地址。这样的函数被称为指针函数。指针函数定义的一般形式:数据类型 *函数名(形参表)int*search(int a,int n)int*min=a;for(int i=1;i

25、*(a+i)min=a+i;return min;例:求一列整数中最小数所在位置,并将其与第一个元素交换位置。int a10=56,78,23,46,88,97,5,85,43,77;int temp,*site=NULL;site=search(a,10);if(*site!=a0)temp=a0;a0=*site;*site=temp;9.4指针与函数243.指向函数的指针变量指向函数的指针变量-函数指针变量函数指针变量函数在编译时分配的存储区的起始地址称为函数的指针(地址),用函数名表示。存放函数指针(地址)的变量是函数指针变量。只要知道函数的地址就可以实现对函数的调用:通过函数名调用;

26、或通过指向函数的指针变量调用。指令1指令2指令指令n nfunc函数func的存储区 int func(int n)if(n=0|n=1)return 1;else return n*func(n-1);int a=5,s;s=func(5);9.4指针与函数25函数类型 (*指针变量)(形参类型1,形参类型2,形参类型n)函数指针int(*p)(int,int)容易与指针函数int *p(int,int)混淆,如同数组指针int(*p)4与指针数组 int*p4一样,可以通过*和()的优先来区分。以int(*p)(int,int)为例,*先修饰的p,p为指针,(int,int)后修饰的p,为

27、指向函数的指针。例1:用函数指针调用函数,求三个数中最大的数。float max(float x,float y,float z)float temp=x;if(tempy)temp=y;if(temp y?x:y);int min(int x,int y)printf(min=);return(x y?x:y);int add(int x,int y)printf(sum=);return(x+y);void process(int x,int y,int(*fun)(int,int)int result;result=(*fun)(x,y);printf(%dn,result);void main()int a,b;scanf(%d%d,&a,&b);process(a,b,max);process(a,b,min);process(a,b,add);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com