C语言程序设计善于利用指针

上传人:wan****21 文档编号:244973824 上传时间:2024-10-06 格式:PPT 页数:32 大小:510.50KB
返回 下载 相关 举报
C语言程序设计善于利用指针_第1页
第1页 / 共32页
C语言程序设计善于利用指针_第2页
第2页 / 共32页
C语言程序设计善于利用指针_第3页
第3页 / 共32页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,1,第,8,章 善于利用指针,C,语言程序设计,北京航空航天大学,交通科学与工程学院,徐国艳,2,/56,指针,的概念,指针和指针变量,指针,与,数组,指针做函数参数,8.1,8.2,8.3,8.4,章节,内容,3,/56,访问内存的两种方式:,直接访问:按地址直接存取&,a,间接访问:通过指针,i,间接存取,8.1,指针,的概念,什么是指针?,如何使用指针?,1000,1008,1004,1023,10,a,b,c,3.5,5,1000,i,对于,int a=10,c=5;,float b=3.5;,内存分配,例,a,的地址,a,的内容,指针,a,的地址,a,是整型变量,存放内容,i,是指针变量,存放地址,a,的地址,a,的指针,指向,a,4,/56,用指针,i,访问:,用,i+,可以指向字符串中的每个地址!,8.1,指针,的概念,1000,i,用指针实现顺序访问,char c=,“,GOOD!,”,;,例,G,c0,O,O,内存分配,D,!,0,c1,c2,c5,1000,1002,1001,1023,为什么要使用指针?,5,/56,8.2,指针和指针变量,一、指针、指针变量与指向,例:,int a=10,*i,x;,float b=3.5,*p1,;,char c,*p2=&c,;,i=,x=*i;,10,i,*,i,a,1000,指针地址,指针变量:,存放地址的变量,指针变量是一种新的数据类型,1000是,a,的指针,i,是指针变量,*,i=a,二、指针变量的定义与赋值,数据类型*指针变量名,1000,*,i,是,i,指向的变量,a,指针运算,*,i,*,i,定义指针变量,指针初始化,指针赋值,6,/56,三、指针变量的赋值与操作,*-指针运算符,&-取地址运算符,同级,右结合,指针变量的赋值,int a=3,*p,*p1,*p2,*p3,p4;,p=,/*,取,a,地址运算,*,/,p1=p;,/*,直接赋值*,/,p2=NULL;,/*,赋空值,不指向任何变量,*/,p3=0;,指针变量的操作,int a=3,*p,*p1,k;,p=,/*a,地址,P,*/,k=*P;,/*3,k,*/,*p=20;,/*20,a,*/,*,&a,=30;,/*,先取,a,的地址,再按地址赋值,3,0,a,*/,p1=,/*,因为,&*,p=&a,操作结果使,p1,指向,a,*/,7,/56,四、,指针的引用,例,8.1,:,指针的赋值与输出,void main(),int a=10,b,c,*p;,p=b=*p,;c=a;,printf(%d,%d,%dn,a,b,c);,printf(%d,%d,%dn,*p,p,&a,);,输出结果:,10,10,10,10,1739919326,1739919326,printf(“%d,%dn,*,第三行输出结果:,10,1739919326,指针赋值,指针运算,指针输出,8,/56,方法1:目标变量值不变,改变指针变量的指向求解。,void main(),int a,b,*,p1,*,p2,*,p,;,p1,=,&,a;,p2,=,&,b;,scanf(,%d%d,p1,p2,);,if(,*,p1,*,p2,),p,=,p1,;,p1,=,p2,;,p2,=,p,;,printf(,a=%d,b=%dn,a,b);,printf(,max=%d,min=%dn,*,p1,*,p2,);,a,b,p1,p2,p,6,8,a=6,b=8,max=8,min=6,8,.,2,指针和指针变量,【例,8,.,2,】,输入,a,、,b,两个整数,使用指针变量按大小顺序输出这两个整数。,9,/56,方法2:利用指针变量直接改变目标变量的值求解。,void main(),int a,b,t,*,p1,*,p2,;,p1,=,&,a;,p2,=,&,b;,scanf(,%d%d,p1,p2,);,if(,*,p1,p1、p2,=,p1。,指针与一个整型数据进行比较是没有意义的,。,不同类型指针变量之间比较是非法的,。,NULL,可以与任何类型指针进行,=,、,!=,的关系运算,用于判断指针是否为空指针,。,404,40,8,412,416,420,12,/56,int i,*p,p=,int *p;,float*q;,p=q;,int i;,float*p;,p=,int*p;,p=100;,是真?是假?,判断,指针变量只,存放地址,!,一个指针变量不能指向与其类型不同的变量,!,我是真的,,你对了吗?,应在类型相同的指针变量之间赋值,13,/56,数组名是该数组的指针,a,是,数组的首地址(即,a0,的地址),是一个指针常量。,a=&a0,a+1=&a1,a+9=&a9,数组元素的下标表示法:,a,0,a,1,a,i,a,9,数组元素的指针表示法:,*,(a+0),*,(a+1),*,(a+i),*,(a+9),8,.,3,指针与数组,8,.,3.1,指向数组的指针,1.一维数组的指针,例如:,int a10,*p;,a0,a9,p,a,14,/56,当,p,指向,a0,时,用,p,表示数组元素,下标法:,p0,p1,pi,p9,指针法:,*,(p+0),*,(p+1),*,(p+i),*,(p+9),a0,a9,p,8,.,3,指针与数组,8,.,3.1,指向数组的指针,1.一维数组的指针,指向一维数组元素的指针变量,由于数组元素也是一个内存变量,所以此类指针变量的定义和使用与指向基本变量的指针变量相同。例如:,int a10,*p;,p=a;,(,或,p=,),a,15,/56,a,0,a,9,p,a,【例,8,.3,.1】,用指针输出数组元素。,#include stdio.h,void main(),int a10,i,*p;,for(i=0;i10;i+),scanf(%d,a+i);,for(i=0;i10;i+),printf(%4d,*(a+i);,printf(n);,for(p=a,i=0;i10;i+),printf(%4d,*(p+i);,printf(n);,8,.,3,指针与数组,8,.,3.1,指向数组的指针,1.一维数组的指针,1,2,3,4,5,6,7,8,9,10,1 2 3 4 5 6 7 8 9 10,1 2 3 4 5 6 7 8 9 10,16,/56,a,0,a,9,p,a,【例,8,.3,.2】,用指针法输入输出数组元素。,main(),int a10,i,*p;,for(p=a;pa+10;p+),scanf(%d,p);,for(p=a;pa+10;p+),printf(%d,*p);,printf(n);,8,.,3,指针与数组,8,.,3.1,指向数组的指针,1.一维数组的指针,10,17,/56,a0,a9,p,a1,.,.,.,.,.,.,1,2,3,4,5,6,7,8,9,10,a,数组名,是地址,指向数组的,指针变量,存放的也是地址。通过指针变量也可以引用数组元素。,p,=,&a0,等效于,p,=,a,。,数组名,和指向数组的,指针变量,的区别:,指针变量,p,是,变量,可以赋值,数组名,a,是地址,常量,不能赋值。,8,.,3,指针与数组,8,.,3.1,指向数组的指针,用指针变量引用数组元素,必须关注其当前值。例如:,p,=,p,+3,*(p-1)、p-1,等价于,a2,18,/56,输入,a,数组,for(p=a;pa+4;p+),pp=p,for(q=p+1;q*q F,pp=q,T pp!=p F,*pp,*p,输出,a,数组,选择法排序,N-S,图,【,例,8.,4】输入五个整数,使用指针变量将这五个数 按从小到大排序后输出。,8,.,3,指针与数组,#include“stdio.h”,void main(),int a5,*pp,*p,*q,t;,for(p=a;pa+5;p+),scanf(%d,p);,for(p=a;pa+4;p+),pp=p;,for(q=p+1;q*q)pp=q;,if(pp!=p),t=*p;*p=*pp;*pp=t;,for(p=a;pstrlen(str)|n=0|m=0),printf(NULLn);,else,for(p=str+m-1,i=0;i=0&weekb)swap(,if(ac)swap(,if(bc)swap(,printf(%d,%d,%dn,a,b,c);,7 5 9,5,7,9,7,a,5,b,9,c,&,a,x1,&,b,x2,7,t,7,9,7,5,7,5,通过指针形参指向域扩展到主调函数,达到主调函数与被调函数间交换多个数据的目的,:,形参,x1,和,x2,得到,main,函数中,a,和,b,的地址,这样,x1,和,x2,的目标变量就是,main,函数的变量,a,和,b,。,在,swap,函数中交换,*,x1,和,*,x2,的内容,就是交换,a,和,b,的内容,所以当函数调用结束后,尽管,x1,和,x2,已经释放,但操作结果仍保留在,main,函数的变量,a,和,b,中,.,30,/56,8,.,4,指针变量作函数参数,2.数组的指针作函数参数,一维数组的指针作函数参数,例如被调函数,abc,的定义形式有以下三种:,void abc(int b10),void abc(int b),void abc(int*b),在主调函数有如下定义:,int a10,*p=a;,则调用,abc,函数时可用,:,abc(a),或,abc(p),当函数之间需要传递数组时,可以通过传递数组的首地址(即通过指针参数指向域的扩展),完成存取主调函数中数组元素的操作。,31,/56,8,.,4,指针变量作函数参数,2.数组的指针作函数参数,【例,8,.20,】字符串复制函数。,void copystr(char,*,t,char,*,s,),/*,字符指针变量,t,和,s,作形参,*/,while(,*,t,+=,*,s,+)!=0);,void main(),char,c,80,*,p,=I am a student.;,copystr(,c,p,);,/*,数组名,c,和字符指针变量,p,作实参,*/,printf(%sn,c);,32,/56,作业,P291,(要求用指针完成),1,3,4,17,18,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


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

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


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