




已阅读5页,还剩89页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章指针的应用,西南交通大学软件学院计算机基础教研室,计算机程序设计与VisualC+,2,教学目标,掌握地址与指针的概念;掌握指针类型变量的定义、赋值以及使用的方法;掌握将一个变量或数组的地址赋给指针类型的变量;掌握指针操作相关的运算符;,3,教学目标,掌握通过指针类型的变量去访问单一变量;掌握通过指针类型的变量去操作一维数组;,4,教学内容,着重介绍指针与指针变量的概念;指针类型变量的定义、赋值以及使用的方法;指针与地址运算符;通过指针类型的变量去访问单一变量;掌握通过指针类型的变量去操作一维数组;,5,5.1指针的概述,例5.1阅读如下程序:,6,#includeusingnamespacestd;voidmain()inta;int*p;a=10;p=,7,程序运行结果:,8,编程技巧:,内存单元的地址计算机的内存储器就象一个巨大的一维数组,每个数组元素就是一个存储单元(在微型计算机中其大小通常为一个字节)。就象数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,称内存单元的地址。,9,编程技巧:,在运行一个程序时,程序本身及其所用到的数据都要放在内存单元中,并以其所占用的第一个存储单元的地址来表示。在C+中,分配内存单元的工作由编译程序完成。计算机通过这种地址编号的方式来管理内存数据读写的准确定位。,10,地址编码的基本单位是字节,每个字节是一个基本内存单元,有一个地址编号。程序中声明的变量是要占据一定的内存空间的,不同的数据类型占用的字节数是不一样的,例如:char型占1个字节,short型占2个字节,int型和long型都占4个字节。,编程技巧:,11,内存单元的内容,内存单元的地址,定义整形变量inti=3,定义整形变量intj=6,内存单元,内存单元,内存单元,12,从内存单元中存取数据的方法直接访问方式:通过变量名间接访问方式:通过地址,编程技巧:,13,直接访问方式:直接对变量的存储单元进行存取访问。在变量获得内存空间的同时,变量名也就成为了相应内存空间的名称,在变量的整个生存期内都可以用这个名字访问该内存空间,表现在程序语句中就是通过变量名存取变量内容。,编程技巧:,14,间接访问方式:先找到存放变量的地址的变量,得到变量的地址,再根据变量的地址找到变量的存储单元,对它进行存取访问。例如:例5.1中,用语句:couta的值表示方法2:*p*p;与语句cinch;等价,*p=*p+32;在键盘输入值的基础上加上32,与语句chch32;等价。(4)用*p输出值。,36,5特别注意:,*出现在定义语句中和执行语句中其含义是不同的。例如:intx=1,*p=/p表示输出指针p所指对象的内容,37,5特别注意:,charch;char*p;p=/*是将字符型变量ch的地址赋给字符型指针变量p,所以一定要先定义ch,然后才能将ch的地址赋给p,而p有明确的指向后才能操作*/,38,例5.4输入a和b两个整数,运用指针技术按先大后小的顺序输出a和b。#include#includeusingnamespacestd;voidmain(void)inta,b;int*p1=,39,cout*p1*p2;if(*p1*p2)cout按先大后小的顺序输出的a和b为:*p2setw(4)*p1endl;elsecout按先大后小的顺序输出的a和b为:*p1setw(4)*p2endl;,40,【例5.5】阅读以下程序,并给出该程序的运行结果。,5.4一维数组与指针,41,#includeusingnamespacestd;voidmain()chara10=abcdefghi;char*p1;p1=a;/指针变量p1指向数组a的首地址p1+=2;/指针变量p1做算术运算,加上2,指向数组a的第三个数组元素的内存单元cout*p1endl;/输出数组的第三个数组元素的值字母c,42,程序运行结果:,43,编程技巧:,1要使用指针变量来访问数组,关键是如何“移动”指针变量,使指针变量指向具体要操作地数组元素的地址,就需要掌握指针变量的算术运算。,44,指针变量的算术运算,指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。指针加一,减一运算指向下一个或前一个数据。,45,pa,46,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),int*pb,47,例如:inta5=1,2,3,4,5;int*p1;p1=a;p1+=2;见图,p1是指向数组a的第三个元素的地址,而不是将p1的地址值简单地加2个字节。,48,由于数组a是int型,每个元素占4个字节,p1+=2意味着使p1的地址值加上了8个字节,使它指向了下下个元素;若把数组a定义成double型,每个元素占8个字节,p1+=2意味着使p的地址值加上了16个字节,使它指向了下下个元素;所以,p1+=2所代表的地址实际上是p+2d;d是所定义的数组类型中每个元素所占的字节数。,49,【例5.6】阅读以下程序,并给出该程序的运行结果。#includeusingnamespacestd;voidmain()chara10=abcdefghi;char*p1,*p2;p1=a;p1+=2;p2=a+4;/指针变量p2,直接由数组名加上4,指向数组的第五个数组元素的内存单元,50,if(p1p2)coutp1所指向的数组元素在p2所指向的数组元素前面!endl;elsecoutp1所指向的数组元素在p2所指向的数组元素后面!endl;p1+;p2-;if(p1=p2)coutp1和p2同时指向数组中的同一个元素且元素值为:*p1endl;elsecoutp1和p2没有指向数组中的同一个元素!ai;/数组名和下标来访问数组cout用数组名和指针运算的方式输出该数组的值:endl;for(i=0;i10;i+)coutsetw(6)*(a+i);/数组名和指针运算来访问数组coutendl;,56,cout用指针变量移动的方式输出该数组的值:endl;for(p=a;p-a10;p+)coutsetw(6)*p;/指针变量的移动来访问数组coutendl;p=a;/指针变量一定要指向数组的首地址coutendl;cout用下标表示法的方式输出该数组的值:endl;for(i=0;i10;i+)coutsetw(6)pi;/下标表示法cout*p;p=a;,62,for(i=0,j=10-1;ij;i+,j-)temp=*(p+i);*(p+i)=*(p+j);*(p+j)=temp;for(p=a;pa+10;p+)coutsetw(4)*p;coutendl;return0;,63,编程技巧:,1定义指针变量操作一维数组,定义后把指针变量指向数组的首地址,用循环输入各个数组元素的值。2再次使用指针变量操作数组前,必须要明确指针变量的指向,即指针变量再次指向数组的首地址,用语句p=a;实现。,64,编程技巧:,3利用了两个变量i,j并赋初值后,用*(p+i)、*(p+j)分别取出数组中首尾元素的值进行交换,然后使i+、j-分别再取出数组中第二个元素的值和倒数第二个元素的值进行交换,直到交换完毕,即条件ij不成立。,65,例5.9把一个整数插入到一个由小到大的有序数列中,并仍然保持由小到大的顺序。思路分析:设有10个整数按由小到大的顺序存放在a数组中,待插入的数存放在变量x中,如:10个有序数依次为:2468121617203040,待插入的数:x=11。要插入的数8x=11apvoidmain(void)intn,j;strings1=;char*p;cout输入需要删除末尾空格的字符串:endl;getline(cin,s1);,74,cout未删除末尾空格前的字符串为:endls1字符串结束标志!endl;n=s1.size();j=n-1;p=,75,编程技巧:,1用string数据类型,加头文件#include。2由于输入字符串含有空格,输入时必须用getline(cin,s1)函数实现输入。3用s1.size()函数求出字符串的长度n,包含字符串的实际长度,字符数组是从下标0开始,最后一个字符的位置应为n-1。4用语句:p=voidmain(void)constintn=20;charstrn;char*p;,方法二,77,coutinputstring:endl;cin.getline(str,strlen(str),n);coutbeforedeleteallstring:strlengthisstrlen(str)*pa;coute;cout*pb;,81,for(pa=a,pc=c;paa+d;pa+)for(pb=b;pbb+e;pb+)if(*pa=*pb)*pc+=*pa;f+;break;cout交集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)ai;,用数组实现:,84,coute;coutbi;for(i=0;id;i+)for(j=0;je;j+)if(ai=bj)cf=ai;f+;break;cout交集c的各个元素依次为:endl;for(i=0;if;i+)coutsetw(4)ci;cout*pa;coute;cout*pb;,87,for(pa=a,pc=c;pa=a+d)*pc+=*pb;f+;cout“并集c的各个元素依次为:endl;for(pc=c;pcc+f;pc+)coutsetw(3)ai;coute;coutbi;,89,for(i=0;i=d)cf=bi;f+;cout并集c的各个元素依次为:endl;for(i=0;if;i+)coutsetw(4)ci;coutendl;,90,#includeusingnamespacestd;voidmain()inta=2,4,6,8,10,y=0,x,*p;p=a;for(x=0;x3;x+)y+=px;coutyendl;,读程序,写结果,91,应用举例:,读程序,写结果,#include#includeusingnamespacestd;voidmain()constintN=10;,92,intb=0,t=9,m=0,x=3;intaN=-5,4,3,-2,-1;int*p=a;while(b*(p+m)b=m+1;else
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能客户服务实务(微课版)-测试题及答案汇 1.1 -8.3
- 小小猪律动课件
- 教务处对期中测试质量分析
- 时间像马车课件
- 2025版动画作品播映权授权及市场推广合同汇编
- 二零二五年度苗木种植扶贫项目合作合同
- 2025版购物中心物业托管与运营管理服务合同
- 二零二五年度工业厂房变形缝施工及改造合同
- 2025版车辆租赁合同:含车辆租赁及司机培训服务
- 二零二五年度高端别墅木工装修劳务分包服务合同范本
- 2025-2030中国家政服务从业人员培训体系与职业发展白皮书
- 2025年安全风险分级管控培训考试试题(附答案)
- 营养指导员试题附答案
- 厂区用电安全管理制度
- 2025年消防员招录面试题库及答案
- 初中英语新人教版八年级上册全册单词(2025秋)
- 2025年广西中考道德与法治试题答案详解讲评课件
- 农贸市场食品安全监管与能力提升培训
- 成人重症患者人工气道湿化护理专家共识解析与临床应用
- 模具订单流程管理规范
- 残疾孩子开学活动方案
评论
0/150
提交评论