已阅读5页,还剩62页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.,1,第五章指针,计算机程序设计与VisualC+,.,2,本章主要内容,C+中指针、指针变量的基本概念指针与地址运算符通过指针类型的变量去访问某个变量指针与数组,.,3,5.1内存地址与指针,内存地址计算机的内存被划分为一个个的存储单元,简称内存单元。内存单元按一定的规则编号,这个编号就是存储单元的地址。,inti=3;,intj=6;,.,4,内存地址,在运行一个程序时,程序本身及其所用到的数据,都要放在内存中,并以其所占用的第一个存储单元的地址来表示。,在C+中,为某个变量或者函数分配内存的工作由编译程序完成。程序中定义的变量或声明的数组等要占用一定的内存空间,不同的数据类型占用的内存空间大小不一样。,.,5,从内存单元中存取数据的方法,直接访问方式通过变量名,直接对变量的存储单元进行存取访问。,变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用该变量名访问其对应的内存空间,表现在程序语句中就是通过变量名存取变量内容。,C+程序中从内存单元中存取数据的方法有两种:直接访问方式和间接访问方式。,inti=3;,intj=6;,.,6,从内存单元中存取数据的方法,间接访问方式先找到存放变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。,inti=3;,intj=6;,.,7,指针,一个变量在内存空间中占用的地址就称为该变量的“指针”。,指针,在C+中专门用来存放内存单元地址的变量类型,就是指针类型。,inti=3;,intj=6;,.,8,指针变量P113,指针变量是一种特殊的变量,用于存放内存单元的地址,即存放地址的变量就是指针变量。指针变量具有变量的三个要素:,(1)变量名,这与一般变量取名相同,由英文字符开始。(2)指针变量的类型,是指针所指向的变量的类型,而不是自身的类型。(3)指针变量的值是某个变量的内存地址。,.,9,指针与指针变量的区别,指针:变量在内存空间中占用的地址。指针变量:用于存储内存地址的变量,指针变量的值是某个变量的内存地址。,.,10,指针变量定义,定义语句中的“*”表示该变量为指针变量。数据类型标识符规定了指针变量指向的变量的数据类型。例如:int*p;表示变量p为指针变量,且指针变量p只能操作整型数据。,数据类型*指针变量名;,指针变量定义的一般格式如下:,.,11,地址运算符:则p=,/*p取指针变量p所指向的变量的值/(即p所指向的内存单元的内容),等价于b=a;,.,13,#includeusingnamespacestd;voidmain()intx,*p;x=3;p=,注意,*出现在定义语句中和执行语句中其含义是不同的。例如:intx,*p;在该语句中,*p是一个int型指针,*在定义语句中,表示定义的是指针变量。*p=*p+10;在该语句中,*p是指针p的内容,*在执行语句表示指针所指对象的内容(取值)。,.,14,指针变量的初始化,在定义指针变量的同时进行赋值,语法形式其中的“地址”可以是变量的地址、数组名、函数名等。,数据类型*指针名地址;,例:inti=3;int*p=注意:用变量地址作为初值时,该变量必须在指针初始化之前定义。,p,.,15,指针变量的赋值P113,例如:int*p,*q;intx=4;p=,指针变量=地址;,/将x变量的地址赋给p,即p指向x,/可以用已赋值的指针赋值给另外一个指针变量。,q,p,.,16,注意事项,不能把常量或表达式的地址赋给指针变量。如:P=,.,17,5.3简单变量与指针,使用指针变量要先定义后使用,使用前,指针变量一定要有明确的指向(即指向某个内存单元地址)例如,int*p=voidmain()intx,*p;p=,/将x在内存中的地址赋给指针变量p,/定义整型指针p,/从键盘接收指针变量p所指向的变量x的值,/输出指针变量p所指向的变量x的值,.,19,#includeusingnamespacestd;voidmain()inta=3;int*pa=,/定义整型指针pa,并初始化为变量a的地址,/定义整型指针p,/将pa赋值给p,即pa和p的值都为变量a的地址值,/输出变量a的地址值,/输出指针变量pa所指向的变量a的值,/输出变量a的地址值,.,20,#includeusingnamespacestd;voidmain()inta;int*p;/定义一个整型的指针变量pa=10;p=,.,21,#includeusingnamespacestd;voidmain()inta=10;int*aptr;aptr=,/a的值(10),/a的地址(0001H),/*aptr取变量a的值,,ch=ch-32;,cout=A,*p=*p+32;,cout=a,cout*p2*p1;,cout*p1*p2;,注意:用变量地址作为指针初值时,该变量必须在指针初始化之前定义。,inta,b;,.,26,#include#includeusingnamespacestd;voidmain()inta,b;int*p1=,.,27,编程实现:键盘输入x和n的值,求下列公式的值,要求sum用指针;,.,28,#includeusingnamespacestd;voidmain()doublee=1.0,t=1.0;inti=1;cout”e=”e=1.0E-7,t=t/i;i=i+1;/等价于i+e=e+t;/等价于e+=t;,P62,.,29,.,30,1.指向数组元素的指针,定义与赋值例:inta10,*pa;pa=指针变量pa指向数组第一个元素,或数组首地址。,5.4一维数组与指针,.,31,2.指针变量的算术运算,指针加一,减一运算“加一”:指向后一个数据;“减一”:指向前一个数据。指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的后方或前方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。,.,32,shorta5=1,2,3,4,5;short*pa;pa=a;pa+=2;,/*指针p加上或减去n,即指针当前指向位置的后方或前方第n个数据的地址。结果值取决于指针指向的数据类型。*/,shorta5,short*pa,pa(a),pa+1,pa+2,pa+3,.,33,inta5=1,2,3,4,5;int*pb;pb=a;pb+=2;,pb+1,pb+2,(a0),(a1),(a2),inta5,int*pb,pb(a),/*指针p加上或减去n,即指针当前指向位置的后方或前方第n个数据的地址。结果值取决于指针指向的数据类型。*/,*pb,*(pb+1),*(pb+2),.,34,对数组中第i+1个元素可表示成以下四种:ai,*(pa+i),*(a+i),pai都是等效的。这四个等价关系使得数组与指针相互转换非常灵活。*pa就是a0。不能写a+,因为a是数组首地址是常量。,通过指针引用数组元素,与上面相对应的有下面四个地址等价关系:voidmain()chara10=“abcdefghi”;char*p1,*p2;p1=a;p1+=2;p2=a+4;cout*p1endl;cout*p2endl;p1+;p2-;if(p1=p2)cout*p1endl;elsecout“p1和p2没有指向数组中的同一个元素”endl;,P1ai;/数组名和下标访问数组p=a;for(i=0;i10;i+)coutpi;/指针变量的下标表示法for(i=0;i10;i+)cout*(a+i);/数组名和指针运算访问数组for(i=0;i10;i+)cout*(p+i);/使用指针变量访问数组for(p=a;pa+10;p+)cout*p;/使用指针变量访问数组(重点掌握),例设有一个int型数组a,有10个元素。用上述四种方法访问数组的各个元素。,.,39,多种方式访问一维数组,设计算法:使用数组下标方式遍历数组使用数组指针运算方式遍历数组使用指针变量移动方式遍历数组把数组全部元素左移一位,最后将首元素赋值给末位元素使用指针变量下标方式遍历变化后的数组,for(i=0,sum=0;i10;i+)coutsetw(6)*(a+i);sum+=*(a+i);coutn该数组元素之和为:sumendl;cout把数组全部元素左移一位,并将移出元素转入末位。endl;for(p=a,i=a0;p-a9;p+)*p=*(p+1);*p=i;cout经过平移变换后该数组元素从左到右(a0-a9):endl;for(p=a,i=0;i10;i+)coutsetw(6)pi;coutai;cout从左到右(a0-a9)该数组各元素的值:n;cout输入数组b的n个元素:*pb;,.,50,for()/从数组a的第一个元素开始比较for()/用数组b的每一个元素和a中元素比cout交集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)*pc;,pa=a;paa+m;pa+,pb=b;pbb+n;pb+,if()/将a、b中相同元素写入c,同时指针pc后移/用变量f记录交集数组c的实际长度/找到a、b中相同元素即退出本轮比较,*pa=*pb,*pc+=*pa;,f+;,break;,/将a,b中所有元素依次进行比较,/如果数组a、b中有相同元素,pc=c,.,51,指针方式访问字符串,设计算法:(1)使用字符串处理函数strcpy,对数组sa赋初值(2)利用指针p的移动,循环完成将数组sa赋值给数组sb,并若sa元素为空格字符时则以下划线字符赋值给数组sb(3)为数组sb末位元素赋值0(4)将指针p指向数组sb首地址,输出sb的首字符和字符串,/5.2指针访问字符串#includeusingnamespacestd;voidmain(void)char*p,sa20,sb20;inti;strcpy_s(sa,TodayisSunday.);for(p=sa,i=0;*p!=0;i+,p+)if(*p=)sbi=_;elsesbi=*p;sbi=0;p=sb;cout*pendl;/输出首字符coutpap,xap,xap,xai;coutx;p=0;/从第一个元素位置开始找插入位置while(xap,可以用如下的四种方法来操作数组。使用数组名和下标(ai)使用指针变量的下标表示法(pai)使用数组名和指针运算(*(a+i)使用指针变量(*(pa+i),.,55,#include#includeusingnamespacestd;voidmain(void)constintN=10;intaN+1,p,x,;coutai;coutx;,for(t=a;t*t;,/用指针变量输入数组元素,*t,/定义指针变量,.,56,p=0;while(xap/插入数据,t=a;p=0;,while(x*(t+p),for(i=N-1;i=p;i-)*(t+i+1)=*(t+i);/,*(t+p)=x;/,for(t=a+N-1;t=a+p;t-)*(t+1)=*t;/,t=a+p;/将指针t指向由p记录的插入位置*t=x;/,.,57,案例5.7查找与插入数据,设计算法:(1)初始化数组和相关变量,键盘输入要查找的数(2)指针p指向数组第一个元素,采用折半查找算法找出相应位置(3)键盘输入欲插入的数据(4)使用指针法逆序移动数组元素到插入位为止(5)将欲插入的数据存储到插入位(6)使用指针法输出插入数据之后的数列,while(bottop)coutx;for(p=a+N-2;pa+pos;p-)*(p+1)=*p;p=a+pos+1;*p=x;cout插入后数据序列:endl;for(p=a;pa+N;p+)coutsetw(6)*p;cout*(ps+i);sum+=*(ps+i);,for(ps=score;psmax)max=*ps;if(*psmin)min=*ps;mark=(sum-min-max)/(n-2);cout去掉1个最高分max去掉1个最低分minendl;cout.precision(2);cout平均成绩为:markendl;ps=score;for(i=0,j=n-1;ij;i+,j-)temp=*(ps+i);*(ps+i)=*(ps+j);*(ps+j)=temp;cout逆序存放后的数据为:endl;for(ps=score;psscore+n;ps+)coutsetw(4)*ps;coutendl;,.,63,示例,利用指针技术,将键盘输入的N个整数按相反的顺序存放并输出。思路分析:分别取出数组最前面和最后面的元素,进行交换,即a0与aN-1交换;然后再分别取出a1与aN-2交换;直到交换完毕。,.,64,交换ai和aj,*(p+i)*(p+j),temp=*(p+i);,*(p+i)=*(p+j);,*(p+j)=temp;,如何用指针变量操作数组元素?如果表示如何用指针变量表示ai,aj?,int*p;p=a;,.,65,#include#includeusingnamespacestd;voidmain()constN=10;intaN,i,j,temp,*p;coutInputteninterger:endl;/用指针变量操作数组元素for(i=0,j=N-1;ij;i+,j-)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;/实现反序存储/用方法输出反序后的数组元素cout*p;,for(p=a;pa+N;p+)couts
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025浙江金华市东阳市部分国有企业招聘200人笔试历年参考题库附带答案详解
- 2025浙江宁波市奉化区三高铁路投资有限公司招聘工作人员拟录用笔试历年参考题库附带答案详解
- 2026年云南农业职业技术学院单招职业技能测试必刷测试卷附答案解析
- 2026年江西传媒职业学院单招综合素质考试必刷测试卷及答案解析(名师系列)
- 2026年浙江师范大学单招职业适应性测试必刷测试卷附答案解析
- 2026年丽水学院单招职业倾向性考试必刷测试卷带答案解析
- 2026年天津商务职业学院单招职业适应性测试题库附答案解析
- 2026年南京机电职业技术学院单招职业倾向性考试题库及答案解析(夺冠系列)
- 2026年云南经贸外事职业学院单招职业技能考试题库带答案解析
- 2026年嘉兴南洋职业技术学院单招职业倾向性考试必刷测试卷带答案解析
- 金丽衢十二校2025学年2026届高三第一次联考 生物试卷(含答案)
- 2025年零售定点药店医保培训考试试题+解析
- 2025年春广东省中职“3+证书”高职高考语文真题(试题+解析)
- 2025日本专家共识:儿童炎症性肠病的诊断课件
- 网络资源获取课件重大版(2023)初中信息科技七年级上册
- 2025云南曲靖市陆良县发展投资集团有限公司招聘42人考试笔试参考题库附答案解析
- 2025江苏连云港海州区国有企业第二次招聘工作人员24人笔试历年典型考点题库附带答案详解试卷3套
- 2025芜湖市湾沚区国有资本建设投资有限公司及子公司第一批招聘12人笔试考试参考题库附答案解析
- 2025年工会换届工作报告总结
- 餐厅后厨消防安全培训
- 新疆招标从业资格证考试及答案解析
评论
0/150
提交评论