ImageVerifierCode 换一换
格式:PPT , 页数:134 ,大小:597KB ,
资源ID:13344504      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13344504.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(数组--指针与字符串.ppt)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

数组--指针与字符串.ppt

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,数组 指针与字符串,本章主要内容,数组,指针,动态存储分配,指针与数组,指针与函数,字符串,数组的概念,数组,是具有一定,顺序关系,的若干,相同类型变量的集合体,,组成数组的变量称为该数组的,元素,。,数组属于构造类型。,数 组,题目:输入,10,个整数,求和,如果和大于,1000,则输出,1,,否则输出,0.,一维数组的声明与引用,一维数组的声明,类型说明符 数组名,常量表达式,;,例如:,int,a10;,表示,a,为整型数组,有,10,个元素:,a0.a9,引用,必须,先声明,,后使用。,只能逐个引

2、用数组,元素,,而不能一次引用整个数组例如:,a0=a5+a7-a2*3,数组名的构成方法与一般变量名相同。,数 组,例,6.1,一维数组的声明与引用,#include,using namespace std;,int,main(),int,A10,B10;,int,i;,for(i=0;i10;i+),Ai,=,i*2-1;,B10-i-1,=,Ai;,数 组,for(i=0;i10;i+),cout,Ai,=,Ai;,cout,Bi,=,Bi,endl,;,一维数组的存储顺序,数组元素,在内存中顺次存放,它们的,地址是连续的,。,例如:具有,10,个元素的数组,a,,,在内存中的存放次序如

3、下:,数组,名字,是数组,首元素的内存地址,。,数组名是一个,常量,,不能被赋值。,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a,数 组,一维数组的初始化,可以在编译阶段使数组得到初值:,在声明数组时对数组元素赋以初值。,例如:,static,int,a10=0,1,2,3,4,5,6,7,8,9;,可以只给一部分元素赋初值。,例如:,static,int,a10=0,1,2,3,4;,在对全部数组元素赋初值时,可以不指定数组长度。,例如:,static,int,a=1,2,3,4,5,数 组,#include,using namespace std;,int,main(),

4、int,i;,static,int,f20=1,1;/,初始化第,0,、,1,个数,for(i=2;i20;i+)fi=fi-2+fi-1;/,求第,2,19,个数,for(i=0;i20;i+)/,输出,每行,5,个数,/,if(i%5=0),cout,endl,;,cout.width(12);/,设置输出宽度为,12,cout,fi;,例:用数组来处理求,Fibonacci,数列问题,例:用数组来处理求,Fibonacci,数列问题,运行结果:,11235,813213455,89144233377610,9871597258441816765,一维数组应用举例,循环从键盘读入若干组选择

5、题答案,计算并输出每组答案的正确率,直到输入,ctrl+z,为止。,每组连续输入,5,个答案,每个答案可以是,a.d,。,数 组,#,include,using namespace std;,int main(),char key =a,c,b,a,d;,char c;,int ques=0,numques=5,numcorrect=0;,cout Enter the numques question tests:endl;,while(cin.get(c),if(c!=n),if(c=keyques),numcorrect+;,cout ;,elsecout *;,else,cout Sco

6、re,float(numcorrect)/numques*100%;,ques=0;/reset variables,numcorrect=0;,cout endl;,continue;,ques+;,12,运行结果:,acbba,*Score 60%,acbad,Score 100%,abbda,*Score 40%,bdcba,*Score 0%,13,数组实验,1.,给出年、月、日,计算该日是该年的第几天。,2.,输入,10,个数存放在数组,A,中,然后输入数据,n,,计算并输出,n,在数组,A,中出现的几率。,题目:,输入,10,个整数,找出其中最大值,然后输出。,输入,10,个整数,

7、排序,然后输出。,插入排序,选择排序,交换排序,顺序查找,折半查找,排序(,sorting,),排序,是计算机程序设计中的一种重要操作,它的功能是将一个,数据元素,的任意序列,重新排列成一个按,关键字,有序的序列。,数据元素:,数据的基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。,关键字:,数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。,在排序过程中需要完成两种基本操作:,比较两个数的大小,调整元素在序列中的位置,内部排序与外部排序,内部排序:,待排序的数据元素存放在计算机内存中进行的排序过程。,外部排序:,待排序的数据元素数量很大,以致内存存中一

8、次不能容纳全部数据,在排序过程中尚需对外存进行访问的排序过程。,内部排序方法,插入排序,选择排序,交换排序,插入排序的基本思想,每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。,初始状态:,5 4 10 20 12 3,插入操作:,1,4,4 5 10 20 12 3,2,10,4 5 10 20 12 3,3,20,4 5 10 20 12 3,4,12,4 5 10 12 20 3,5,3,3 4 5 10 12 20,直接插入排序,在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这里我们只介绍最简单的直接插入排序算

9、法。,void,InsertionSort,(,int,A,int,n),int,i,j;,int,temp;,for(i=1;i 0&temp Aj-1),Aj=Aj-1;,j-;,Aj=temp;,22,选择排序的基本思想,每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。,5 4 10 20,12 3,初始状态:,3 ,4,10 20 12 5,3 4 10 20 12,5,第,i,次选择后,将选出的那个记录与第,i,个记录做,交换,。,3 4 5 20 12,10,.,.,直接选择排序,在选择类排序方法中,从待排序序列中选

10、择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为直接选择排序。,直接选择排序函数,void Swap(,int,&x,int,&y),int,temp;,temp=x;,x=y;,y=temp;,void,SelectionSort,(,int,A,int,n),int,smallIndex,;,int,i,j;,for(i=0;i n-1;i+),smallIndex,=i;,for(j=i+1;j n;j+),if(Aj 0),lastExchangeIndex,=0;,for(j=0;j i;j+),if(Aj+1 Aj),Swap(

11、Aj,Aj+1);,lastExchangeIndex,=j;,i=,lastExchangeIndex,;,顺序查找,其基本思想,从序列的首元素开始,逐个元素与待查找的关键字进行比较,直到找到相等的。若整个序列中没有与待查找关键字相等的元素,就是查找不成功。,顺序查找函数,int,SeqSearch,(,int,list,int,n,T key),for(,int,i=0;i n;i+),if(listi=key),return i;,return-1;,31,折半查找的基本思想,对于已按关键字排序的序列,经过一次比较,可将序列分割成两部分,然后只在有可能包含待查元素的一部分中继续查找,并根

12、据试探结果继续分割,逐步缩小查找范围,直至找到或找不到为止。,折半查找举例,用折半查找法,在下列序列中查找值为,21,的元素:,L=1,5,13,19,21,37,56,64,75,80,88,92,H=11,M=INT(L+H)/2)=6,5,13,19,21,37,L=1,H=M-1=5,M=INT(L+H)/2)=3,M,21,37,H,L=M+1=4,L,M=INT(L+H)/2)=4,M,折半查找函数模板,int,BinSearch,(,int,list,int,n,int,key),int,mid,low,high;,int,midvalue,;,low=0;,high=n-1;,

13、while(low=high),mid=(low+high)/2;,midvalue,=listmid;,if(key=,midvalue,)return mid;,else if(key,midvalue,)high=mid-1;,else low=mid+1;,return-1;,指针数组,数组的元素是指针型,例:,int,*pa2;,由,pa0,pa1,两个指针组成,利用指针数组存放单位矩阵,#include,using namespace std;,int,main(),int,line1=1,0,0;/,声明数组,矩阵的第一行,int,line2=0,1,0;/,声明数组,矩阵的第二

14、行,int,line3=0,0,1;/,声明数组,矩阵的第三行,int,*p_line3;/,声明整型指针数组,p_line0=line1;/,初始化指针数组元素,p_line1=line2;,p_line2=line3;,/,输出单位矩阵,cout,Matrix test:,endl,;,for(,int,i=0;i3;i+)/,对指针数组元素循环,for(,int,j=0;j3;j+)/,对矩阵每一行循环,cout,p_lineij;,cout,endl,;,输出结果为:,Matrix test:,1,0,0,0,1,0,0,0,1,37,二维数组举例,#include,using nam

15、espace std;,int,main(),int,array223=11,12,13,21,22,23;,for(,int,i=0;i2;i+),cout,*(array2+i),endl,;,for(,int,j=0;j3;j+),cout,*(*(array2+i)+j),;,/,或者,cout,array2ij,;,cout,endl,;,指 针,在某次运行之后,程序的输出结果为:,0X0065FDE0,11,12,13,0X0065FDEC,21,22,23,39,二维数组的声明及引用,数据类型 标识符,常量表达式,1,常量表达式,2;,例,:,int,a53;,表示,a,为整型二

16、维数组,其中第一维有,5,个下标(,04,),第二维有,3,个下标(,02,),数组的元素个数为,15,,可以用于存放,5,行,3,列的整型数据表格。,存储顺序,按行存放,上例中数组,a,的存储顺序为:,二维数组的声明,类型说明符 数组名,常量表达式,常量表达式,例如:,float a34;,a,00,a,01,a,02,a,03,a,10,a,11,a,12,a,13,a,20,a,21,a,22,a,23,a0a,00,a,01,a,02,a,03,a1a,10,a,11,a,12,a,13,a2a,20,a,21,a,22,a,23,a,可以理解为:,引用,例如:,b12=a23/2,下

17、标不要越界,二维数组的声明及引用,41,将所有数据写在一个,内,按顺序赋值,例如:,static,int,a34=1,2,3,4,5,6,7,8,9,10,11,12;,分行给二维数组赋初值,例如:,static,int,a34=1,2,3,4,5,6,7,8,9,10,11,12;,可以对部分元素赋初值,例如:,static,int,a34=1,0,6,0,0,11;,二维数组的初始化,42,指向二维数组的指针,int,a23=1,2,3,4,5,6;,int,*p;,p=/,等价于,p=a0;,cout,*p=*p,endl,;,/,运行结果:*,p=1,/p=a;/,错误,p,不能用二维

18、数组的数组名给,/,指针变量赋值,cout,a11=*(p+4),endl,;,/p+n1*m1+m2,n1,表示行数,,m1,表示每,/,行元素数,m2,表示列数,int,(*p1)3;/,指向数组的指针,p1=a;,/,正确,用二维数组的数组名给指向数,/,组的指针变量赋值,cout,*(*(p1+1),endl,;,/*p1,*(p1+1),表示第,0,、,1,行首元素,/,的地址,cout,a,endl,;,cout,a0,endl,;/a,和,a0,都表,/,示元素,a00,的地址,cout,p1,endl,;,/p1,表示第,0,行首元素的地址,int,a23,*p,(*p1)3;

19、p=,或,p=a0;,p=p+1;p,指向,a01,p1=a;,p1=p1+1;p1,指向下一行,数组作为函数参数,数组元素作实参,与单个变量一样。,数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组,。,数 组,例,6-2,使用数组名作为函数参数,主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。,数 组,#,include,using namespace std;,void RowSum(int A4,int nrow),int su

20、m;,for(int i=0;i nrow;i+),sum=0;,for(int j=0;j 4;j+),sum+=Aij;,cout Sum of row i is sum endl;,Ai0=sum;,48,int main(),int Table34=1,2,3,4,2,3,4,5,3,4,5,6;,for(int i=0;i 3;i+),for(int j=0;j 4;j+),cout Tableij ;,cout endl;,RowSum(Table,3);,for(int i=0;i 3;i+),cout Tablei,0,49,运行结果:,1 2 3 4,2 3 4 5,3 4

21、5 6,Sum of row 0 is 10,Sum of row 1 is 14,Sum of row 2 is 18,10 14 18,50,动态申请内存操作符,new,new,类型名,T,(,初值列表),功能:,在程序执行期间,申请用于存放,T,类型对象的内存空间,并依初值列表赋以初值。,结果值:,成功:,T,类型的指针,指向新分配的内存。失败:0(,NULL,),动态存储分配,释放内存操作符,delete,delete,指针,P,功能:,释放指针,P,所指向的内存。,P,必须,是,new,操作的返回值。,动态存储分配,动态创建多维数组,new,类型名,T,下标表达式,1,下标表达式,2

22、如果内存申请成功,,new,运算返回一个指向新分配内存首地址的指针,是一个,T,类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:,char(*,fp,)3;,fp,=new char23;,char(*,fp,)3;,fp,fp+1,fp00,fp01,fp02,fp10,fp11,fp12,54,例,6-18,动态创建多维数组,#include,using namespace std;,int,main(),float(*cp)98;,int,i,j,k;,cp=new float898;,for(i=0;i8;i+),for(j=0;j9;j+),for(k=0

23、k9;k+),*(*(*(cp+i)+j)+k)=i*100+j*10+k;,/,通过指针访问数组元素,动态存储分配,for(i=0;i8;i+),for(j=0;j9;j+),for(k=0;k8;k+),/,将指针,cp,作为数组名使用,,/,通过数组名和下标访问数组元素,cout,cpijk ;,cout,endl,;,cout,endl,;,56,动态存储分配函数,void,*malloc,(size);,参数,size,:,欲分配的字节数,返回值:成功,则返回,void,型指针。失败,则返回空指针。,头文件:,和,动态存储分配,动态内存释放函数,void free(void,*me

24、mblock,);,参数,memblock,:,指针,指向需释放的 内存。,返回值:无,头文件:,和,动态存储分配,用字符数组存储和处理字符串,字符数组的声明和引用,例:,static char str8=112,114,111,103,114,97,109,0;static char str8=p,r,o,g,r,a,m,0;static char str8=program;static char,str,=program;,字符串,字符串常量,例如:,china,没有字符串变量,用字符数组来存放字符串,字符串以,0,为结束标志,字符数组的初始化,字符串,例,6-22,输出一个字符串,#in

25、clude,using namespace std;,int,main(),static char c10=I,a,m,a,b,o,y,;,int,i;,for(i=0;i10;i+),cout,ci;,cout,endl,;,运行结果:,I am a boy,字符串,例,6-23,输出一个钻石图形,#include,using namespace std;,int,main(),static char diamond5=,*,*,*,*,*,*,*,*;,int,i,j,;,for(i=0;i5;i+),for(j=0;j5 j+),cout,diamondij;,cout,endl,;,运

26、行结果:,*,*,*,*,*,字符串,字符串的输入,/,输出,方法,逐个字符输入输出,将整个字符串一次输入或输出,例:,char c=China;,cout,str1str2str3;,运行时输入数据:,How are you?,内存中变量状态如下:,str1:H o w 0,str2:a r e 0,str3:y o u?0,63,若改为:,static char str13;,cin,str,;,运行时输入数据:,How are you?,内存中变量,str,内容如下:,str,:H o w 0,64,用字符数组存储和处理字符串,注意!若有如下声明,:,char a4,*p1,*p2;,错

27、误的,:,a=abc,;,cin,p1;,正确的,:p1=abc;p2=a;,cin,p2;,字符串,整行输入字符串,cin.getline(,字符数组名,St,字符个数,N,结束符);,功能:,一次连续读入多个字符(可以包括空格),直到读满,N,个,或遇到指定的结束符(默认为,n,)。,读入的字符串存放于字符数组,St,中。,读取但不存储结束符,。,cin.get,(,字符数组名,St,字符个数,N,结束符,);,功能:,一次连续读入多个字符(可以包括空格),直到读,满,N,个,或遇到指定的结束符(默认为,n,)。,读入的字符串存放于字符数组,St,中。,既不读取也不存储结束符,。,字符串,

28、整行输入字符串举例,#include,using namespace std;,void main(void),char,city,80;,char,state,80;,int,i;,for(i=0;i 2;i+),cin.getline(city,80,);,cin.getline(state,80,n);,cout,City:city State:state,endl,;,字符串,运行结果,Beijing,China,City:Beijing Country:China,Shanghai,China,City:Shanghai Country:China,字符串处理函数,strcat,(,

29、连接),,strcpy,(,复制),,strcmp,(,比较),,strlen,(,求长度),,strlwr,(,转换为小写),,strupr,(,转换为大写),头文件,字符串,例,6.21 string,类应用举例,#include,#include,using namespace std;,void,trueFalse,(,int,x),cout,(x?True:False),endl,;,字符串,int,main(),string S1,=DEF,S2,=123;,char CP1=ABC;,char CP2=DEF;,cout,S1 is S1,endl,;,cout,S2 is S2

30、endl,;,cout,length of S2:,S2.length,(),endl,;,cout,CP1 is CP1,endl,;,cout,CP2 is CP2,endl,;,cout,S1=CP1 returned;,trueFalse(,S1=,CP1);,cout,CP2=S1 returned;,trueFalse(CP2,=S1,);,S2+=S1,;,cout,S2=S2+S1:,S2,endl,;,cout,length of S2:,S2.length,(),endl,;,71,关于内存地址,内存空间的访问方式,通过变量名访问,通过地址访问,地址运算符:,&,例:,i

31、nt,var,;,则,&var,表示变量,var,在内存中的起始地址,数据和内存,数据以二进制的形式存放在内存中,作一个形象的比喻,内存就像一个大蜂巢,它由数以亿计的蜂室组成,每个蜂室存放一个,0,或者一个,1,,如图所示。,比特(,bit,),那么内存到底由什么组成呢?原来内存是由千千万万个具有两个状态的电子开关组成的。电子开关打开时代表,1,,闭合时代表,0,。因此每个电子开关可以代表一位二进制数,计算机内存就是一个庞大的电子开关的集合体。这些电子开关称为比特(,bit,),是最小的存储单位。比特也叫做位。,如下图所示的一组电子开关表示二进制,10110010,,即十进制的,178,。因此

32、内存中的数据可以看作由,0,和,1,组成的数据流。,字节(,Byte,),要方便地存取信息,必须把这些电子开关有机地组织起来,一般用,8,个二进制位组成一个字节,如下图所示。,计算机内存就是由很多排列整齐的字节组成的,为了管理方便,每个字节都有相应的位置编号,这个编号就是这个字节的,“,地址,”,,通过地址可以找到内存中任何一个字节的内容,如下图所示,声明,例:,static,int,i;,static,int,*i_pointer=,指向整型变量的指针,指针变量的概念,概念,指针:内存地址,用于 间接访问内存单元,指针变量:用于存放地址的变量,2000,3,i_pointer,*i_poin

33、ter,i,2000,内存用户数据区,变量,i,变量,j,变量,i_pointer,3,6,2000,2000,2004,3010,引用,例,1,:,i=3;,例,2,:*,i_pointer=3;,指 针,指针变量的初始化,语法形式,存储类型 数据类型 *指针名初始地址;,例:,int,*pa=,注意事项,用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。,可以用一个已赋初值的指针去初始化另一 个指针变量。,不要用一个内部,auto,变量去初始化,static,指针。,指 针,指针变量的赋值运算,指针名,=,地址,“,地址,”,中存放的数据类型与指针类型必

34、须相符。,向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数,0,,表示空指针。,指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是,unsigned long,int,型。,允许声明指向,void,类型的指针。该指针可以被赋予任何类型对象的地址。,例:,void*general;,指 针,例,6-5,指针的声明、赋值与使用,#include,using namespace std;,int,main(),int,*i_pointer;/,声明,int,型指针,i_pointer,int,i;/,声明,int,型数,i,i_pointe

35、r=/,取,i,的地址赋给,i_pointer,i=10;/,int,型数赋初值,cout,Output,int,i=i,endl,;/,输出,int,型数的值,cout,Output,int,pointer i=*i_pointer,endl,;,/,输出,int,型指针所指地址的内容,指 针,程序运行的结果是:,Output,int,i=10,Output,int,pointer i=10,83,例,6-6 void,类型指针的使用,void,vobject,;/,错,不能声明,void,类型的变量,void,*pv,;/,对,可以声明,void,类型的指针,int,*pint;,int,

36、i;,int,main(),pv,=/void,类型指针指向整型变量,/void,指针赋值给,int,指针需要类型强制转换,:,pint=(,int,*),pv,;,指 针,指向常量的指针,不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。,例,1,char*name1=John;/name1,是一般指针,*,name1=A;/,编译正确,运行出错,例,2,const char*,name1,=John;/,指向常量的指针,char s,=abc,;,name1,=s;/,正确,,name1,本身的值可以改变,*,name1,=1;/,编译时指出错误,指 针,指针类型的常

37、量,若声明指针常量,则指针本身的值不能被改变。例:,char *const name2=John;,name2=abc;/,错误,指针常量值不能改变,指针变量的算术运算,指针与整数的加减运算,指针,p,加上或减去,n,,,其意义是指针当前指向位置的前方或后方第,n,个数据的地址。,这种运算的结果值取决于指针指向的数据类型。,指针加一,减一运算,指向下一个或前一个数据。,例如:,y=*px+,相当于,y=*(,px+,)(*,和,+,优先级相同,自右向左运算,),指 针,pa,pa-2,pa-1,pa+1,pa+2,pa+3,*,(pa-2),*pa,*,(pa+1),*,(pa+2),*,(p

38、a+3),*,(pa-1),short*pa,88,pb-1,pb,pb+1,pb+2,*,(pb-1),*,pb,*,(pb+1),*,(pb+2),long,*pb,89,关系运算,指向相同类型数据的指针之间可以进行各种关系运算。,指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。,指针可以和零之间进行等于或不等于的关系运算。例如:,p=0,或,p!=0,赋值运算,向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数,0,,表示空指针。,指针变量的关系运算,指 针,指向数组元素的指针,声明与赋值,例:,int,a10,*pa;,pa=,或,pa=a;

39、通过指针引用数组元素,经过上述声明及赋值后:,*,pa,就是,a0,,*,(pa+1),就是,a1,,,.,,*,(pa+i),就是,ai.,ai,*(pa+i),*(a+i),pai,都是等效的。,不能写,a+,,,因为,a,是数组首地址是常量。,指 针,例6-7,设有一个,int,型数组,a,,有,10,个元素。用三种方法输出各元素:,使用数组名和下标,使用数组名和指针运算,使用指针变量,指 针,int,main(),int,a10;,int,i;,for(i=0;iai;,cout,endl,;,for(i=0;i10;i+),cout,ai,;,使用数组名和下标,93,int,mai

40、n(),int,a10;,int,i;,for(i=0;iai;,cout,endl,;,for(i=0;i10;i+),cout,*(a+i);,使用数组名指针运算,使用指针变量,int,main(),int,a10;,int,*p,i,;,for(i=0;iai;,cout,endl,;,for(p=a;p(a+10);p+),cout,*p,;,以指针作为函数参数,以地址方式传递数据,可以用来返回函数处理结果。,实参是数组名时形参可以是指针。,指针与函数,例6.10,题目:读入三个浮点数,将整数部分和小数部分分别输出,#,include,using namespace std;,void

41、 splitfloat(float x,int,*intpart,float,*fracpart,),/,形参,intpart、fracpart,是指针,*intpart,=int(x);/,取,x,的整数部分,*fracpart,=x-*intpart;/,取,x,的小数部分,指针与函数,int main(),int i,n;,float x,f;,cout Enter three(3)floating point numbers endl;,for(i=0;i x;,splitfloat(x,&n,&f,);/,变量地址做实参,cout Integer Part is ,n,Fractio

42、n Part is ,f,endl;,98,运行结果:,Enter three(3)floating point numbers,4.7,Integer Part is 4 Fraction Part is 0.7,8.913,Integer Part is 8 Fraction Part is 0.913,-4.7518,Integer Part is-4 Fraction Part is-0.7518,99,例,:,输出数组元素的内容和地址,#,include,#include,using namespace std;,void Array_Ptr(long,*P,int n),int i

43、cout In func,address of array is unsigned long(,P,)endl;,cout Accessing array in the function using pointers endl;,for(i=0;i n;i+),cout Address for index i is unsigned long,(P+i);,cout Value is ,*(P+i),endl;,指针与函数,int main(),long list5=50,60,70,80,90;,cout In main,address of array is,unsigned long

44、list,)endl;,cout endl;,Array_Ptr(list,5);,运行结果:,In main,address of array is 6684132,In,func,address of array is 6684132,Accessing array in the function using pointers,Address for index 0 is 6684132 Value is 50,Address for index 1 is 6684136 Value is 60,Address for index 2 is 6684140 Value is 70,Ad

45、dress for index 3 is 6684144 Value is 80,Address for index 4 is 6684148 Value is 90,102,指向常量的指针做形参,#include,using namespace std;,const,int,N=6;,void print(,const,int,*p,int,n);,int,main(),int,arrayN;,for(,int,i=0;iarrayi;,print(,array,N);,指 针,void print(,const,int,*p,int,n),cout,*p;,for(,int,i=1;in;

46、i+),cout,.*(p+i);,cout,endl,;,104,指针型函数,当函数的返回值是地址时,该函数就是指针形函数。,声明形式,存储类型 数据类型 *函数名,(),指针与函数,声明形式,存储类型 数据类型,(*,函数指针名,)();,含义:,数据指针指向数据存储区,而函数指针指向的是程序代码存储区。,指向函数的指针,指针与函数,例,6-11,函数指针,#include,using namespace std;,void print_stuff(float data_to_ignore);,void print_message(float list_this_data);,void p

47、rint_float(float data_to_print);,void(*,function_pointer,)(float);,int,main(),float pi=(float)3.14159;,float two_pi=(float)2.0*pi;,指针与函数,print_stuff(pi);,function_pointer,=,print_stuff,;,function_pointer,(pi);,function_pointer,=,print_message,;,function_pointer,(two_pi);,function_pointer,(13.0);,fun

48、ction_pointer,=,print_float,;,function_pointer,(pi);,print_float(pi);,108,void print_stuff(float data_to_ignore),cout,This is the print stuff function.n;,void print_message(float list_this_data),cout,The data to be listed is,list_this_data,endl,;,void print_float(float data_to_print),cout,The data t

49、o be printed is,data_to_print,endl,;,109,运行结果:,This is the print stuff function.,This is the print stuff function.,The data to be listed is 6.283180,The data to be listed is 13.000000,The data to be printed is 3.141590,The data to be printed is 3.141590,110,动态申请内存操作符,new,new,类型名,T,(,初值列表),功能:,在程序执行期

50、间,申请用于存放,T,类型对象的内存空间,并依初值列表赋以初值。,结果值:,成功:,T,类型的指针,指向新分配的内存。失败:0(,NULL,),动态存储分配,释放内存操作符,delete,delete,指针,P,功能:,释放指针,P,所指向的内存。,P,必须,是,new,操作的返回值。,动态存储分配,动态创建多维数组,new,类型名,T,下标表达式,1,下标表达式,2,;,如果内存申请成功,,new,运算返回一个指向新分配内存首地址的指针,是一个,T,类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:,char(*,fp,)3;,fp,=new char23;,char(*

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

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

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

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

gongan.png浙公网安备33021202000488号   

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

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

客服