![指针的定义和应用课件_第1页](http://file4.renrendoc.com/view/0838c6efc70db72cc2e10c26ccd0ef12/0838c6efc70db72cc2e10c26ccd0ef121.gif)
![指针的定义和应用课件_第2页](http://file4.renrendoc.com/view/0838c6efc70db72cc2e10c26ccd0ef12/0838c6efc70db72cc2e10c26ccd0ef122.gif)
![指针的定义和应用课件_第3页](http://file4.renrendoc.com/view/0838c6efc70db72cc2e10c26ccd0ef12/0838c6efc70db72cc2e10c26ccd0ef123.gif)
![指针的定义和应用课件_第4页](http://file4.renrendoc.com/view/0838c6efc70db72cc2e10c26ccd0ef12/0838c6efc70db72cc2e10c26ccd0ef124.gif)
![指针的定义和应用课件_第5页](http://file4.renrendoc.com/view/0838c6efc70db72cc2e10c26ccd0ef12/0838c6efc70db72cc2e10c26ccd0ef125.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第15章指针西南交通大学软件学院计算机基础教研室C++编程导论1第15章指针西南交通大学软件学院C++编程导论1本章主要内容C++中指针的基本概念指针类型变量的定义方法指针与地址运算符指针变量赋值、指针的运算通过指针类型的变量去访问某个变量或数组元素的值引用动态分配内存按引用调用2本章主要内容C++中指针的基本概念2什么是地址?计算机的内存储器就象一个巨大的一维数组,每个数组元素就是一个存储单元(在微型计算机中其大小通常为一个字节)。就象数组中的每个元素都有一个下标一样,每个内存单元都有一个编号,又称地址。3什么是地址?计算机的内存储器就象一个巨大的一维数组,每个数什么是地址?在运行一个程序时,程序本身及其所用到的数据都要放在内存储器中:程序、函数、变量、常数、数组和对象等,在内存储器中占有一席之地。存放在内存储器中的程序和数据都有一个地址,用它们占用的那片存储单元中的第一个存储单元的地址表示。4什么是地址?在运行一个程序时,程序本身及其所用到的数据都要什么是地址?在C++中,为某个变量或者函数分配内存储器的工作由编译程序完成。内存地址的访问方式直接访问方式:通过变量名访问间接访问方式:通过地址访问5什么是地址?在C++中,为某个变量或者函数分配内存储器的工作如何知道某个变量、数组、函数的地址C++规定:变量的地址可以使用地址运算符&求得。例如,&x表示变量x的地址;数组的地址,即数组第一个元素的地址,可以直接用数组名表示;函数的地址用函数名表示。6如何知道某个变量、数组、函数的地址C++规定:6什么是指针指针是C++语言中的一种数据类型,是专门用来处理地址的。指针是某个内存单元的首地址。7什么是指针指针是C++语言中的一种数据类型,是专门用来处理地什么是指针变量?指针变量是包含另一个变量地址的变量。指针变量也是一个变量,遵循先定义,后使用。定义指针变量的类型是由该指针指向的变量类型决定。8什么是指针变量?指针变量是包含另一个变量地址的变量。8指针变量的概念定义例:inti;int*i_pointer;指向整型变量的指针内存用户数据区变量i变量j变量
i_pointer3620002000200430109指针变量的概念定义内存用户数据区变量i变量j变量
i_指针变量的声明变量的指针:变量在内存中的存放起始地址指针变量的声明:
类型标识符*指针变量例如:int*p;
①
定义语句中的“*”表示该变量为指针变量②
一个指针变量只能存储同一种类型变量的地址10指针变量的声明变量的指针:变量在内存中的存放起始地址10指针变量的初始化语法形式
类型标识符*指针名=初始地址;例:int*pa=&a;11指针变量的初始化语法形式11指针变量的初始化注意事项用变量地址作为初值时,该变量必须在指针初始化之前定义。如:inta;int*pa=&a;已赋初值的指针可以初始化另一个指针变量。int*pa=&a;int*pb;pb=pa;12指针变量的初始化注意事项12指针与地址运算符“&”在执行语句中作为取地址运算符,它是一元运算符,返回操作数的地址,操作数必须是变量名。“*”除了可以在声明语句中声明指针时使用外,还可以在执行语句中作为为指针运算符使用,也称为“间接访问”运算符,指针运算符是一元运算符,指针运算符*表示指针所指向的变量的值。&a:取变量a的地址。*a:指针变量所指向的变量的值。inty=5;int*p;p=&y;cout<<*p;
13指针与地址运算符“&”在执行语句中作为取地址运算符,它是一指针与地址运算符
*出现在声明语句和执行语句中的含义是不同的。int*p;//*在声明语句中表示声明的是指针,声明p是整型指针cout<<*p;//*在执行语句中表示指针所指对象的内容14指针与地址运算符*出现在声明语句和执行语句中的含义是不同的指针变量的赋值运算指针变量=地址p=&a;p=array;//将数组的首地址赋值给pp=&array[i];//将数组的第i个元素的地址赋值给pp=max;//将函数max的入口地址赋给pp1=p2;//将指针p2的值赋个指针p115指针变量的赋值运算指针变量=地址15指针变量的赋值运算指针变量=地址不能把常量或表达式的地址赋给指针变量。
如:P=&67;P=&(i+5)是非法的
不能将一个整数赋给指针变量,但可以赋整数值0,表示该指针空指针,不指向任何内容。指针的类型是它所指向变量的类型。允许声明指向void类型的指针。该指针可以被赋予任何类型对象的地址。例:void*general;16指针变量的赋值运算指针变量=地址16例1指针的定义、赋值与使用#include<iostream>usingnamespacestd;voidmain(){int*i_pointer;inti;i_pointer=&i;i=10;cout<<“Outputinti=”<<i<<endl;cout<<"Outputintpointeri="<<*i_pointer<<endl;}17例1指针的定义、赋值与使用#include<iostre程序运行的结果是:Outputinti=10Outputintpointeri=1018程序运行的结果是:18指针变量的算术运算指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。这种运算的结果值取决于指针指向的数据类型。指针加一,减一运算指向下一个或前一个数据。19指针变量的算术运算指针与整数的加减运算19papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa20papa-2pa-1pa+1pa+2pa+3*(pa-2)*pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)int*pb21pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1关系运算两个指针变量指向同一个数组中的元素时,其关系运算的结果表明了这两个指针变量所指向的数组元素的先后关系指针可以和零之间进行等于或不等于的关系运算。例如:p==0或p!=0指针变量的关系运算22关系运算指针变量的关系运算22指针的关系运算例如:chara[10];char*p1,*p2;p1=a+2;p2=a+4;
p1++;p2--;23指针的关系运算例如:p1++;p2--;23指向数组元素的指针定义与赋值例:inta[10],*pa;pa=&a[0];或pa=a;24指向数组元素的指针定义与赋值24指向数组元素的指针通过指针引用数组元素经过上述声明及赋值后,在执行语句中*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。不能写a++,因为a是数组首地址是常量。25指向数组元素的指针通过指针引用数组元素25应用举例2设有一个int型数组a,有10个元素。用四种方法访问数组的各个元素:使用数组名和下标使用数组名和指针运算使用指针变量使用下标表示法引用指针指向的数组元素26应用举例2设有一个int型数组a,有10个元素。用四种方法访#include<iostream>usingnamespacestd;voidmain(){inta[10];inti,*p;for(i=0;i<10;i++)cin>>a[i];for(i=0;i<10;i++)cout<<*(a+i);for(p=a;p-a<10;p++)cout<<*p;p=a;for(i=0;i<10;i++)cout<<p[i];}27#include<iostream>27应用举例3#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){constintM=20,N=10;inta[M],b[N],c[M];intd,e,f=0,*pa,*pb,*pc;
从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其交集28应用举例3#include<iostream>cout<<"输入数组a中元素的个数:"<<endl;cin>>d;cout<<"输入数组a的"<<d<<"个元素:"<<endl;for(pa=a;pa<a+d;pa++)cin>>*pa;cout<<"输入数组b中元素的个数:"<<endl;cin>>e;cout<<"输入数组b的"<<e<<"个元素:"<<endl;for(pb=b;pb<b+e;pb++)cin>>*pb;29cout<<"输入数组a中元素的个数:"<<endl;29for(pa=a,pc=c;pa<a+d;pa++)for(pb=b;pb<b+e;pb++) if(*pa==*pb) {*pc++=*pa; f++; break; }cout<<"交集c的各个元素依次为:"<<endl;for(pc=c;pc<c+f;pc++)cout<<setw(3)<<*pc;}30for(pa=a,pc=c;pa<a+d;pa++)30应用举例4#include<iostream>#include<iomanip>usingnamespacestd;voidmain(){constintM=20,N=10;inta[M],b[N],c[M+N];intd,e,f=0,*pa,*pb,*pc;
从键盘输入整数集合a、b的元素个数和各个元素的值,计算并输出其并集31应用举例4#include<iostream>cout<<"输入数组a中元素的个数:"<<endl;cin>>d;cout<<"输入数组a的"<<d<<"个元素:"<<endl;for(pa=a;pa<a+d;pa++)cin>>*pa;cout<<"输入数组b中元素的个数:"<<endl;cin>>e;cout<<"输入数组b的"<<e<<"个元素:"<<endl;for(pb=b;pb<b+e;pb++)cin>>*pb;32cout<<"输入数组a中元素的个数:"<<endl;32
for(pa=a,pc=c;pa<a+d;pa++,pc++){*pc=*pa;f++;}for(pb=b;pb<b+e;pb++){for(pa=a;pa<a+d;pa++) if(*pb==*pa) break;if(pa>=a+d) {*pc++=*pb;f++;}}cout<<“并集c的各个元素依次为:"<<endl;for(pc=c;pc<c+f;pc++)cout<<setw(3)<<*pc;}33for(pa=a,pc=c;pa<a+d;pa++,pc+字符指针来存储和处理字符串字符指针与字符串字符串是由字符数组中的结束标志符“\0”之前的字符组成的特殊数组,指向这一特殊数组的指针则称字符串指针。字符串指针的定义、赋值和引用与指向数组的指针基本相同34字符指针来存储和处理字符串字符指针与字符串34用字符数组存储和处理字符串注意!若有如下定义:chara[4]=“abc”,*p2=a;cin>>p2;正确的//等价于cin>>a;35用字符数组存储和处理字符串注意!若有如下定义:35字符指针的定义、赋值和引用--例5#include<iostream>#include<string>usingnamespacestd;voidmain(){char*p,sa[20],sb[20];inti;p=sa;strcpy(sa,“TodayisSunday.”);for(i=0;*(sa+i)!=‘\0’;i++)sb[i]=*p++;sb[i]=‘\0’;p=sb;cout<<p;}36字符指针的定义、赋值和引用--例5#include<ios动态存储分配静态存储分配:程序中使用的变量和数组的类型、数目、大小是由编写程序时确定的,程序运行时这些数据占用的存储空间数也是一定的。缺点:程序无法在运行时根据具体情况(如用户输入)灵活调整存储分配情况。动态存储分配:使用指针、运算符new和delete,在程序运行期间按照实际需要申请适量内存,克服了静态存储分配的缺点。37动态存储分配静态存储分配:37动态申请内存操作符new<指针>=new<类型><指针>=new<类型>(<初值>)功能:在程序执行期间,申请用于存放类型对象的内存空间,并依初值列表赋以初值。结果值:成功:类型的指针,指向新分配的内存首地址。失败:0(NULL)38动态申请内存操作符new<指针>=new<类型>38动态申请内存操作符new例如:intx,*p=newint(6);x=*p;cout<<x<<*p<<endl;deletep;39动态申请内存操作符new例如:39动态申请内存操作符newnew运算符为数组申请内存使用形式:<指针>=new<数据类型>[<数组大小>]40动态申请内存操作符newnew运算符为数组申请内存40释放内存操作符deletedelete〈指针〉功能:释放指针P所指向的内存。P必须是new操作的返回值。41释放内存操作符deletedelete〈指针〉41使用动态存储分配时,应注意:确认分配成功后才能使用。分配成功后不宜变动指针的值。用运算符new获取的内存空间,必须用delete进行释放。对一个指针只能调用一次delete。在使用delete运算符进行释放时,不用考虑数组的维数。42使用动态存储分配时,应注意:42动态存储分配--例6
从内存中获取一个整型数组,赋值后并打印出来。#include<iostream>#include<stdlib>usingnamespacestd;voidmain(){intn,i;//定义数组元素的个数int*p;43动态存储分配--例6从内存中获取一个整型数组,赋值后cout<<“pleaseinputthelengthofthearray:”<<endl;cin>>n;if((p=newint[n])==0){cout<<“can’tallocatememory.”<<endl;exit(1);}for(i=0;i<n;i++)p[i]=i*2;cout<<“nowoutputthearray:”<<endl;for(i=0;i<n;i++)cout<<p[i]<<““;cout<<endl;delete[]p;}44cout<<“pleaseinputthelength运行结果为:pleaseinputthelengthofthearray:6nowoutputthearray:024681045运行结果为:45引用声明引用的格式
类型&引用名=变量名;例:inta=1;int&b=a;//将引用b声明为变量a的别名int&c=a;//将引用c声明为变量a的别名引用是实体的别名,对引用的存取就是对变量的存取,引用与被引用的实体具有相同的地址。无初始化的引用是无效的。cout<<a<<b<<c;//有声明语句46引用声明引用的格式46按引用调用C++用两种方式向函数传递数值:值调用引用调用按引用调用时,调用者让被调用函数能够直接访问调用者的数据,并允许被调用函数能够修改其中的数据。按引用调用分为用引用参数按引用调用和用指针参数按引用调用。47按引用调用C++用两种方式向函数传递数值:47按引用调用用引用参数是其相应参数的别名。要表示函数的参数是按引用传递的,在函数原型和函数头中该参数类型后面加上&。在函数调用中,只要指定变量名,该变量就会通过引用传递。在被调用函数体中,通过引用参数名指定的变量实际上就是引用了调用函数中的原始变量,被调用函数可以直接修改原始变量。48按引用调用用引用参数是其相应参数的别名。要表示函数的参数是按按引用调用用指针参数按引用调用是用指针和间接运算符模拟按引用调用。调用函数并要修改参数时,传递该参数地址,在要修改数值的变量名前面加上&符号。49按引用调用用指针参数按引用调用是用指针和间接运算符模拟按引用用引用参数按引用调用-例7#include<iostream>usingnamespacestd;voidcubeByReference(int&);voidmain(){ intz=4; cout<<"z="<<z; cubeByReference(z); cout<<"z="<<z;}50用引用参数按引用调用-例7#include<iostrea用引用参数按引用调用-例7voidcubeByReference(int&cRef){ cRef=cRef*cRef*cRef;}51用引用参数按引用调用-例7voidcubeByRefere用指针参数按引用调用-例8#include<iostream>usingnamespacestd;voidcubeByReference(int*);voidmain(){ intz=4; cout<<"z="<<z; cubeByReference(&z); cout<<"z="<<z;}52用指针参数按引用调用-例8#include<iostream用指针参数按引用调用-例8voidcubeByReference(int*p){ *p=*p**p**p;}53用指针参数按引用调用-例8voidcubeByRefere数组名做函数参数
当数组名作为函数参数时,参数的传递方式为地址传递,即实参与形参表示同一个数组,因此被调函数中对形参数组内容的修改将修改主调函数中实参数组的内容。
54数组名做函数参数当数组名作为函数参数时,参数的传递方式为地数组名做函数参数实参与形参都是数组名。实参数组与形参数组类型应一致,如不一致,结果将出错。实参数组与形参数组维数大小可以不一致也可以一致。因为C++编译系统对形参大小不作检查,只是将实参数组的起始地址传给形参。如果要求形参数组得到实参数组全部的元素值,最好指定形参数组与实参数组大小一致。55数组名做函数参数实参与形参都是数组名。55数组名做函数参数数组名作函数参数时,是“地址传递”,把实参数组的起始地址传递给形参数组,两个数组共同占用同一段内存单元。形参数组是多维数时,定义时可以指定每一维的大小,也可省略第一维大小的说明,但不能省略第二维以及其它高维大小的说明。56数组名做函数参数数组名作函数参数时,是“地址传递”,把实参数[例9]将键盘输入的10个整数按从小到大的顺序排序(选择法)。
57[例9]将键盘输入的10个整数按从小到大的顺序排序(选择法)#include<iostream>usingnamespacestd;voidinvert(inta[],intn){ intt=0; for(inti=0;i<n-1;i++) for(intj=i+1;j<n;j++) if(a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}}58#include<iostream>58intmain(){ inti; inta[10]; cout<<"Input10numbers:"<<endl; for(i=0;i<10;i++) cin>>a[i]; invert(a,10); cout<<"Thesortednumbersis:"<<endl; for(i=0;i<10;i++) cout<<a[i]<<endl; return0;}
59intmain()59指向数组的指针变量作为函数参数
将一组同类型的数据(数组)从一个函数传递到另一个函数,可以采用数组名作为函数参数,也可以采用指向数组的指针变量作为函数参数。当函数的形参为指向数组的指针时,函数的实参即可以是数组名,也可
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025至2030年中国高频热合粘扣带数据监测研究报告
- 2025至2030年中国五妙水仙膏数据监测研究报告
- 2025年度建筑节能评估咨询技术服务合同
- 2025年度化肥生产技术改造与升级合同
- 2025年度个人创业担保贷款合同范本62970(2024版)
- 2025年度知识产权保护与版权授权合同
- 2025年度体育赛事运营合作合同范本
- 2025年度医疗器械机械加工制造合同(医疗版)
- 2025年度房地产项目股权收购合同补充协议
- 2025年度农产品加工简易用工合同
- 2025年初中语文:春晚观后感三篇
- Unit 7 第3课时 Section A (Grammar Focus -4c)(导学案)-【上好课】2022-2023学年八年级英语下册同步备课系列(人教新目标Go For It!)
- 2025年上半年长沙市公安局招考警务辅助人员(500名)易考易错模拟试题(共500题)试卷后附参考答案
- 《教育强国建设规划纲要(2024-2035年)》解读讲座
- 2025河北邯郸世纪建设投资集团招聘专业技术人才30人高频重点提升(共500题)附带答案详解
- 慈溪高一期末数学试卷
- 《基于新课程标准的初中数学课堂教学评价研究》
- 省级产业园区基础设施项目可行性研究报告
- 2025年中国东方航空招聘笔试参考题库含答案解析
- 《微生物燃料电池MF》课件
- 预算绩效评价管理机构入围投标文件(技术方案)
评论
0/150
提交评论