




已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精选,1,指针(1),精选,2,指针的概念,数据在内存中是如何存取的?,系统根据程序中定义变量的类型,给变量分配一定的长度空间。字符型占1个字节,整型数占4个字节.。内存区的每个字节都有编号,称之为地址。,内存单元的地址,内存单元的内容,精选,3,1、直接访问,按变量地址存取变量的值。cini;实际上放到定义i单元的地址中。,2、间接访问,将变量的地址存放在另一个单元p中,通过p取出变量的地址,再针对变量操作。,一个变量的地址称为该变量的指针。,如果在程序中定义了一个变量或数组,那么,这个变量或数组的地址(指针)也就确定为一个常量。,精选,4,变量的指针和指向变量的指针变量,变量的指针就是变量的地址,当变量定义后,其指针(地址)是一常量。,可以定义一个变量专门用来存放另一变量的地址,这种变量我们称之为指针变量。在编译时同样分配一定字节的存储单元,未赋初值时,该存储单元内的值是随机的。,指针变量定义的一般形式为:,类型标识符*变量名,int*i_point;,i,2000H,inti;,i_point=,也可以在定义指针变量时赋初值:,inti;int*i_point=,*在定义语句中只表示变量的类型是指针,没有任何计算意义。,*在语句中表示“指向”。p=100;p=,intmain(void)inta=10,b=100;int*p1,*p2;p1=,非法,指针变量赋值,指针变量引用,10100,10100,表示指向,精选,7,intmain(void)inta,b;int*p1,*p2;p1=,通过指针对变量赋值,指针变量赋值,指针变量引用,精选,8,#includeusingnamespacestd;intmain(void)inta,b;int*p1,*p2;*p1=10;*p2=100;coutatbendl;cout*p1t*p2ab;p1=,b,a,p1,p2,p=,+,-,*优先级相同,都是右结合性。,相当于a+。表达式为3,a=4,(*p)+;,4,精选,11,inta=3,*p;p=,+,-,*优先级相同,都是右结合性。,2004H,*(p+)首先*p,然后p=p+1,指针指向下一个int单元表达式为3,p=2004H。,*p+;,精选,12,inta=3,*p;p=,+,-,*优先级相同,都是右结合性。,4,+(*p)*p=*p+1a=4,+*p,精选,13,inta=3,*p;p=,+,-,*优先级相同,都是右结合性。,2004H,*(+p),首先:p=p+1,然后取*p。即取p所指的下一个int单元的内容。表达式为5p2004H,*+p,精选,14,指针变量作为函数参数,精选,15,指针变量作为函数参数函数的参数可以是指针类型,它的作用是将一个变量的地址传送到另一个函数中。,指针变量作为函数参数与变量本身作函数参数不同,变量作函数参数传递的是具体值,而指针作函数参数传递的是内存的地址。,精选,16,输入a,b两个整数,按大小输出这两个数。,intmain(void)int*point1,*point2,a,b;cinab;point1=,swap(int*p1,int*p2)intt;t=*p1;*p1=*p2;*p2=t;,10,100,10,a=100,b=10,输出:a=100,b=10100,10,精选,17,输入a,b两个整数,按大小输出这两个数。,intmain(void)int*point1,*point2,a,b;cinab;point1=,swap(intx,inty)intt;t=x;x=y;y=t;,10,100,10,x=100,y=10,输出:a=10,b=10010,100,值传递,精选,18,用指针变量作函数参数,在被调函数的执行过程中,应使指针变量所指向的参数值发生变化,这样,函数在调用结束后,其变化值才能保留回主调函数。,用指针变量作函数参数,可以得到多个变化了的值。,函数调用不能改变实参指针变量的值,但可以改变实参指针变量所指向变量的值。,定义swap(int*p1,int*p2),调用swap(point1,point2);,精选,19,voidprt(int*x,int*y,int*z)cout+*x,+*y,*(z+)*p;sum=s(p);cout“sum=”sumendl;,输入:135,sum=11,sum=13,sum=15,p,sum=sum+*p;returnsum;,11,11,精选,21,sub(int*s)staticintt=0;t=*s+t;returnt;intmain(void)inti,k;for(i=0;iai;for(p=a;pa+10;p+)cout*pai;for(i=0;i10;i+)cout*p+t;,精选,29,intmain(void)intx=1,2,3;ints,i,*p;s=1;p=x;for(i=0;i3;i+)s*=*(p+i);coutsendl;,6,p,i=0,s=s*(*(p+0),=s*1=1,i=1,s=s*(*(p+1),=s*2=2,i=2,s=s*(*(p+2),=s*3=6,p+1,p+2,精选,30,数组名作函数参数,精选,31,数组名作函数参数,数组名可以作函数的实参和形参传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。在函数调用时,形参数组并没有另外开辟新的存储单元是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。,精选,32,intmain(void)intarray10;.f(array,10);.,f(intarr,intn).,实参数组,形参数组,必须进行类型说明,用数组名作形参,因为接收的是地址,所以可以不指定具体的元素个数。,1、形参实参都用数组名,精选,33,2028H,2024H,2020H,201CH,2014H,2010H,200CH,2008H,2004H,2000H,array9,array8,array7,array6,array5,array4,array3,array2,array1,array0,array,arr,arr0,指向同一存储区间,精选,34,2、实参用数组名,形参用指针变量,intmain(void)inta10;.f(a,10);.,f(int*x,intn).,实参数组,形参指针,精选,35,3、形参实参都用指针变量,intmain(void)inta10,*p;p=a;.f(p,10);.,f(int*x,intn).,实参指针,形参指针,实参指针变量调用前必须赋值,精选,36,4、实参为指针变量,形参为数组名,intmain(void)inta10,*p;p=a;.f(p,10);.,f(intx,intn).,实参指针,形参数组,精选,37,将数组中的n个数按相反顺序存放。,voidinv(intx,intn)intt,i,j,m=(n-1)/2;for(i=0;i=m;i+)j=n-1-i;t=xi;xi=xj;xj=t;,intmain(void)inti,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);for(i=0;i10;i+)coutait;,x与a数组指向同一段内存,精选,38,voidinv(int*x,intn)int*p,t,*i,*j,m=(n-1)/2;i=x;j=x+n-1;p=x+m;for(;i=p;i+,j-)t=*i;*i=*j;*j=t;,intmain(void)inti,a10=3,7,9,11,0,6,7,5,4,2;inv(a,10);for(i=0;i10;i+)coutaix;n=fun(x,a);for(inti=0;in;i+)coutait;cout=a,intmain(void)charstr100;cin.getline(str,100);change(str);coutstrendl;,精选,43,总结:数组名作函数参数,数组名可以作函数的实参和形参,传递的是数组的地址。这样,实参、形参共同指向同一段内存单元,内存单元中的数据发生变化,这种变化会反应到主调函数内。,在函数调用时,形参数组并没有另外开辟新的存储单元,而是以实参数组的首地址作为形参数组的首地址。这样形参数组的元素值发生了变化也就使实参数组的元素值发生了变化。,精选,44,既然数组做形参没有开辟新的内存单元,接受的只是实参数组的首地址,那么,这个首地址也可以在被调函数中用一个指针变量来接受,通过在被调函数中对这个指针变量的指向进行操作而使实参数组发生变化。,实参,在主调函数开辟的空间,形参,用指针变量来接受地址,实际上在被调函数中只开辟了p的空间,里面放的是a的值。,精选,45,四、指向多维数组的指针和指针变量,用指针变量也可以指向多维数组,表示的同样是多维数组的首地址。,inta34;/首地址为2000H,可以将a数组看作一个一维数组,这个一维数组的每个元素又是一个具有4个int型数据的一维数组,这样,我们就可以利用一维数组的概念来标记一些写法。,精选,46,a0=*(a+0),a+0为a0的地址设数组的首地址为1900H,则:a为_*a为_a+2为_*a+2为_*(a+1)+2为_*a为_*(*a+9)为_(a+1)1为_,1908H,1900H,1920H,1900H,1918H,1,19,1920H,精选,52,字符串的指针和指向字符串的指针变量,字符串的表示形式,1、用字符数组实现,intmain(void)charstring=“IloveChina”;coutstring;,string,string为数组名,代表数组的首地址,是常量。,数组首地址,精选,53,charstring20;string=“IloveChina”;,strcpy(string,“IloveChina”);,cin.getline(string);/从键盘输入,错误!常量不能赋值,正确赋值形式,精选,54,2、用字符指针表示字符串,intmain(void)char*string=“IloveChina”;coutstring;,string,字符串常量,指针变量,将内存中字符串常量的首地址赋给一个指针变量,精选,55,intmain(void)char*string;string=“IloveChina”;,*string=“IloveChina”;,char*string;cin.getline(string);,指针变量赋值,合法,具体字符,指针未赋值就作指向运算,精选,56,将字符串a复制到字符串b。,intmain(void)chara=“Iamaboy”,b20;inti;for(i=0;*(a+i)!=0;i+)*(b+i)=*(a+i);*(b+i)=0;coutaendl;coutbendl;,a,b,i=0,*(b+i)=*(a+i),bi=ai,I,i=1,i=2,a,y,0,必须以0结束,精选,57,intmain(void)chara=“Iamaboy”,b20;char*p1,*p2;inti;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;coutaendl;coutbendl;,a,b,p1,a,p2,b,*p2=*p1,I,a+1,p1,b+1,p2,p1,p2,0,必须以0结束,y,精选,58,intmain(void)chara=“Iamaboy”,b20;char*p1,*p2;inti;p1=a;p2=b;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;coutaendl;coutbendl;,for(;*p1!=0;)*p2+=*p1+;*p2=0;,while(*p2+=*p1+);,for(;*p2+=*p1+;);,for(;(*p2+=*p1+)!=0;);,精选,59,字符串指针作函数参数,精选,60,字符串指针作函数参数,将一个字符串从一个函数传递到另一个函数,可以用地址传递的办法。即用字符数组名作参数或用指向字符串的指针变量作参数。在被调函数中可以改变原字符串的内容。,精选,61,将字符串a复制到字符串b。,intmain(void)chara=“Iamateacher”;charb=“Youareastudent”;copy_string(a,b);coutaendl;coutbendl;,copy_string(charfrom,charto)inti;for(i=0;fromi!=0;i+)toi=fromi;toi=0;,a,b,from,to,from与a一个地址,to与b一个地址,精选,62,将字符串a复制到字符串b。,intmain(void)chara=“Iamateacher”;charb=“Youareastudent”;copy_string(a,b);coutaendl;coutbendl;,copy_string(char*from,char*to)for(;*from!=0;)*to+=*from+;*to=0;,for(;*from+=*to+;);,也可以用字符指针来接受数组名,a,b,from,to,精选,63,字符指针变量与字符数组,字符数组和字符指针变量都可以实现字符串的存储和运算,区别在于:,字符数组名是常量,定义时必须指明占用的空间大小。,字符指针变量是变量,里面存储的是字符型地址,可以整体赋值,但字符串必须以0结尾。,精选,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC SRD 63347-1:2025 EN Smart city use case collection and analysis - Managing public health emergencies in smart cities - Part 1: High level analysis
- 新解读《GB-T 30637-2014食用葛根粉》
- 重庆扶贫政策培训课件
- 人教版八年级英语上册单元同步知识点与语法训练 unit1 section A
- 暑假培优练:静电场中的能量(学生版)-2025人教版新高二物理暑假专项提升
- 新解读《GB-T 6323-2014汽车操纵稳定性试验方法》
- DB5333-T 37-2024 草地贪夜蛾监测及防治技术规程
- 《物理学概论》课程简介与教学大纲
- 《大学物理2B》课程简介与教学大纲
- 社会科学研究方法 课件 第十章 个案研究
- 预科化学(化学实验基本方法)课件
- 材料科学基础(上海交大)第1章原子结构与键合课件
- 《文明如厕》课件
- (中职)《电子商务基础》第1套试卷试题及答案
- GB∕T 3098.25-2020 紧固件机械性能 不锈钢和镍合金紧固件选用指南
- 硬笔书法第一课新版ppt
- 部编版语文八年级下册第一单元口语交际 应对 练习(含答案解析)
- 部编版八年级上册语文《消息二则》课件(定稿)
- 新员工三级安全教育培训试题(有答案)
- 预测分析:技术、模型与应用 - SAP Predictive Analytics
- 2014中国神经外科颅底内镜临床应用技术专家共识
评论
0/150
提交评论