收藏 分销(赏)

C语言教学课件:14-1_地址与指针.ppt

上传人:可**** 文档编号:12032240 上传时间:2025-08-31 格式:PPT 页数:34 大小:902.50KB 下载积分:10 金币
下载 相关 举报
C语言教学课件:14-1_地址与指针.ppt_第1页
第1页 / 共34页
C语言教学课件:14-1_地址与指针.ppt_第2页
第2页 / 共34页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,1,第十四部分 指针,2,C,程序设计中使用指针可以,:,使程序简洁、紧凑、高效,有效地表示复杂的数据结构,动态分配内存,得到,多于一个的函数返回值,成也萧何 败也萧何,3,地址与指针,指针变量的定义和使用,指针与数组,指针数组,多维数组作为参数的通用函数,动态存储管理,定义类型,指向函数的指针,主要内容,4,1,地址与指针,变量与地址,程序中,:int i;,double k;,内存中每个字节有一个编号,-,地址(类似于房间的房号),.,.,2000,2001,2002,2005,内存,0,2003,i,k,编译或函数调用时为其分配内存单元,变量,是对程序中数据,存储空间的抽象,5,.,.,2000,2004,2006,2005,整型变量,i,10,变量,i,_pointer,2001,2002,2003,指针:一个变量的地址,指针变量:专门存放变量地址的变量叫指针变量,2000,指针,指针变量,变量的,内容,变量的,地址,指针变量,变量,变量地址,(,指针,),变量值,指向,地址存入,指针变量,指针与指针变量,6,地址与指针,指针变量的定义和使用,指针与数组,指针数组,多维数组作为参数的通用函数,动态存储管理,定义类型,指向函数的指针,主要内容,7,2,指针变量的定义和使用,指针有类型,只能保存特定类型的变量的地址;,定义指针需指明,指向类型,。定义指向,int,的,指针变量,:,int*p,*q;,指针变量可以与其他变量一起定义:,double*p,n,a10,*q,*p1,m;,指针是,变量,,可赋值取值,有定义域与存在期。,8,取地址运算符,&,和间接访问操作,*,。都是一元运算符,取地址运算,:,&,写在,变量名前,取,变量地址,是对应类型的指针值,可赋给类型合适的指针。,int n,*p,*q,*p1,a10;,p=,指针操作,指针赋值:将对象的地址存入指针变量。,间接访问:通过指针访问被指对象。,9,间接运算,*,写在指针变量前用来取指针所指变量的值。,间接运算得到被指针所指的变量,这种表达式可以像普通变量一样使用。,int n=7,*p,*q,,,a10;,p=&n,;,*,p=17,;q=p;,/*,相当于,n=17;*/,这里写*,p,相当于直接写,n,。,m=*p+*q*n;/*,访问,n,三次*,/,+*p;/*,使变量,n,的值加,1,,变成,18*/,(*p)+;/*,使变量,n,的值再加,1,,变成,19,。,*,/,*p+=*q+n;/*,变量,n,被赋以新值,57*/,q=/*,指针,q,指向了数组,a,的元素,a0*/,10,直接访问:按变量地址存取变量值,间接访问:通过存放变量地址的变量去访问变量,例,i=,3,;,-,直接访问,指针变量,.,.,2000,2004,2006,2005,整型变量,i,10,变量,i,_pointer,2001,2002,2003,2000,3,例,i_pointer=,*i_pointer=,20,;,-,间接访问,20,直接访问与间接访问,11,指针变量,.,.,2000,2004,2006,2005,整型变量,i,10,变量,i,_pointer,2001,2002,2003,2000,整型变量,k,例,k=i;,-,直接访问,k=*i_pointer;,-,间接访问,10,例子图解,12,2000,2004,2008,地址,i,p=&i,假定一个整型数据占四个存储单元。,int i;,int*p=(p=2000),p+;(p=2004),p+;(p=2008),p-;(p=2004),指针变量算术运算的过程;,p,新,=p,原值,+n*sizeof(,类型),不允许直接对指针变量赋常量值。,如:,int*point;,point=2000;,(,),13,int main(),int*p1,*p2,*p,a,b;,scanf(“%d,%d”,p1=,if(a b)p=p1;p1=p2;p2=p;,printf(“a=%d,b=%dn”,a,b);,printf(“max=%d,min=%dn”,*p1,*p2);,return 0;,&a,7,&b,8,p2,p1,&b,7,&a,8,p2,p1,a,b,b,a,p,例 分析下面程序的功能,14,指针作为函数参数,例:定义函数,swap,,希望用它交换两个变量的值。,问题:,因为要改变两个变量,无法通过返回值解决。,指针作为函数参数有特殊意义,利用这种参数可写出能,修改调用时环境的函数。,一般变量(含数组元素)作为函数参数时,数组名作为函数参数,指针作为函数参数,15,void swap0(int x,int y),int t=x;,x=y;y=t;,int f(),int a=5,b=10;,swap0(a,b),;,是否能完成,a,b,交换?,否,16,例,通过函数调用把变量值设置为,3,void set3(int*np),*np=3;,int main(),int n,m;,/*printf(%d,%dn,n,m);*/,set3(/*,设置,n,和,m*/,set3(,printf(%d,%dn,n,m);,return 0;,请回忆,scanf,的情况:,scanf(“%d”,本质是通过间接访问的方式对变量,n,赋值。,17,通过参数改变调用环境的方案,:,函数定义中用,指针参数,;,void set3(int*np),函数内用,间接操作,实际变量;,*,np=3;,调用时以被操作,变量的地址,作为实参。,set3(,函数,swap,可定义为:,void swap(int*p,int*q),int t=*p;,*p=*q;*q=t;,交换变量,m,和,n,的值,调用形式是:,swap(,18,swap,参数类型是,(int*),实参,必须是,合法的整型变量的地址,设有变量定义:,int a10,k;,调用,swap,的实例:,swap(,swap(,19,特点:,共享内存,“,双向,”,传递,void swap(int x,int y),int temp;,temp=x;,x=y;,y=temp;,int main(),int a,b;,scanf(%d,%d,if(a b)swap(a,b);,printf(n%d,%dn,a,b);,return 0;,例 将数从大到小输出,(1)-,实参、形参都是整型,.,.,2000,2008,200A,2002,2004,2006,5,变量,a,变量,b,(main),9,变量,temp,变量,y,变量,x,(swap),5,5,9,5,9,COPY,指针变量作为函数参数,地址传递,运行结果:,5,9,值传递,20,void swap(int x,int y),int t;,t=x;x=y;y=t;,int main(),int a,b;,int*pointer_1,*pointer_2;,scanf(%d,%d,pointer_1=,if(ab),swap(*pointer_1,*pointer_2);,printf(n%d,%dn,a,b);,return 0;,运行结果:,5,,,9,值传递,.,2000,2008,200A,2002,2004,2006,200C,200E,2010,.,5,9,整型,a,整型,b,(main),pointer_1,pointer_2,2000,2002,9,COPY,(swap),整型,x,整型,y,整型,t,5,5,5,9,例,将数从大到小输出(,2,),-,实参与形参都是整型,21,运行结果:,5,,,9,void swap(int*p1,int*p2),int*p;,p=p1;,p1=p2;,p2=p;,int main(),int a,b;,int*pointer_1,*pointer_2;,scanf(%d,%d,pointer_1=,if(a b),swap(pointer_1,pointer_2);,printf(%d,%d,*pointer_1,*pointer_2);,return 0;,.,2000,2008,200A,2002,2004,2006,200C,200E,2010,.,5,9,整型,a,整型,b,(main),pointer_1,pointer_2,2000,2002,2000,2002,COPY,(swap),指针,p1,指针,p2,指针,p,*,2000,地址传递,2000,2002,例,将数从大到小输出(,3,),实参、形参都是指针(地址交换),22,void swap(int *p1,int *p2),int p;,p=*p1;,*p1=*p2;,*p2=p;,int main(),int a,b;,int*pointer_1,*pointer_2;,scanf(%d,%d,pointer_1=,if(ab),swap(pointer_1,pointer_2);,printf(n%d,%dn,a,b);,return 0;,.,2000,2008,200A,2002,2004,2006,200C,200E,2010,.,5,9,整型变量,a,整型变量,b,(main),指针,pointer_1,指针,pointer_2,2000,2002,(swap),指针,p1,指针,p2,整型,p,5,9,2000,2002,COPY,5,例 将数从大到小输出,(4)-,实参、形参都是指针(内容交换),地址传递,运行结果:,9,,,5,23,例,1,:不用函数返回值,用指针返回求,n!,的结果。,#include,void factor(long*,int);,void factor(long*f,int n),int i;,for(i=1;i=n;i+),*f=*f*i;,int main(),long fac=1;,int n=5;,factor(,printf(%d!=%ldn,n,fac);,return 0;,24,int main(),int a,b,c,*p1,*p2,*p3;,scanf(“%d,%d,%d”,p1=,exchange(p1,p2,p3);,printf(“%d,%d,%dn”,a,b,c);,return 0;,void exchange(int*q1,int*q2,int*q3),if(*q1 *q2)swap(q1,q2);,if(*q1 *q3)swap(q1,q3);,if(*q2 *y),return,x,;,else,return,y,;,int main(),int a=2,b=3;,int*p;,p=f1(,printf(%dn,*p);,retrun 0;,.,2000,2008,200A,2002,2004,2006,2,3,指针变量,y,指针变量,x,(f1),2002,2000,COPY,变量,a,变量,b,(main),指针变量,p,*,例 写一个函数,求两个,int,型变量中居于较大值的变量的地址(,1,),27,.,.,2000,2008,200A,2002,2004,2006,2,变量,a,变量,b,(main),3,指针变量,p,*,2002,int*,f1(int*x,int*y),if(*x *y),return,x,;,else,return,y;,int main(),int a=2,b=3;,int*p;,p=f1(,printf(%dn,*p);,retrun 0;,例 写一个函数,求两个,int,型变量中居于较大值的变量的地址(,2,),28,int*,f3(int x,int y),if(x y),return,&x,;,else,return,&y,;,int main(),int a=2,b=3;,int*p;,p=f3(a,b);,printf(%dn,*p);,return 0;,.,2000,2008,200A,2002,2004,2006,2,3,变量,y,变量,x,(f3),3,2,COPY,变量,a,变量,b,(main),指针变量,p,*,例 写一个函数,求两个,int,型变量中居于较大值的变量的地址(,3,),29,不能返回,形参,或,局部变量,的,地址,作函数返回值,.,.,2000,2008,200A,2002,2004,2006,2,变量,a,变量,b,(main),3,指针变量,p,*,200A,int*,f3(int x,int y),if(xy),return,else,return,int main(),int a=2,b=3;,int*p;,p=f3(a,b);,printf(%dn,*p);,return 0;,例 写一个函数,求两个,int,型变量中居于较大值的变量的地址(,4,),30,空指针值,一个特殊指针值,表示指针变量闲置(未指向任何变量)。,唯一对任何指针类型都合法的值,空指针值用,0,表示,标准库专门定义了符号常量,NULL,p=NULL;,和,p=0;,相同,前一写法易看到是指针,用时必须包含任一个标准头文件。,指针初始化,指针变量定义时可用,合法指针值,初始化:,int n,*p=,若没有初始化,外部指针和局部静态指针自动初始化为空;,局部自动指针不自动初始化。,与指针有关的一些问题讨论,31,使用指针的最常见错误是,非法间接访问,:在指针未指向合法变量的情况下做间接访问。如:,int f(.),int*p,n=3;,*p=2,;./*p,是悬空指针*,/,p,没有初始化,,没有指向合法变量。,“,悬空指针”,指值不是当时合法的变量地址的指针变量,也常被称为“,野指针,”。,间接访问悬空指针是严重错误,后果可能很严重。,指针使用中的常见错误,32,类型,(void*),,,可以指向任何类型变量,。声明:,int n,*p;,double x,*q;,void*gp1,*gp2;,任何指针值可以赋给通用指针,(不必转换),。例:,gp1=/gp1,指向,n,(值是,n,的地址),gp2=/gp2,指向,x,通用指针,33,可以把通用指针的值赋给普通指针,若通用指针,gp1,指向,n,,,n,的类型是普通指针,p,的指向类型,将,gp1,赋给,p,(要写强制转换)通过,p,保证正确访问,n,。,被赋指针与通用指针所指变量类型不符,赋值后间接访问的效果没有保证。,int n,*p;,double x,*q;,void*gp1,*gp2;,gp1=,p=(int*)gp1;,/*,合法,,,p,是,(int*)*/,q=,(double*),gp1;/*,不合法,,,q,是,(double*)*/,指针类型转换并不改变指针值,只是一种观点转换,通用指针,不能做间接运算,通用指针可以指向任何变量,通过通用指针间接访问的意义无法确定。通用指针没提供被指对象的类型信息,所以不能通过它们直接使用被指对象,通用指针唯一用途就是提供指针值,34,Q&A!,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服