第7章指针与引用_第1页
第7章指针与引用_第2页
第7章指针与引用_第3页
第7章指针与引用_第4页
第7章指针与引用_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

,7.1指针的声明和操作7.2指针与数组7.3指针与函数7.4动态内存分配7.5引用,第7章:指针与引用,指针是保存内存地址的变量,是C+语言从C语言中继承来的重要概念,是C+语言最重要的特色之一。C+指针保存内存地址的功能使得程序员可以直接管理计算机内存。C+指针还可以用在函数的传址调用等场合,使得C+语言的功能变得非常强大。本章我们首先介绍指针的概念及其使用。同时,由于引用是C+语言引入的与指针密切相关的概念,本章也将作重点介绍。,7.1指针的声明和操作,数据在内存中的存储方式是:按其所属的数据类型,占据一定数量的连续内存单元。一个变量对应的内存空间可用其首地址和数据类型来唯一确定。为了能像变量名那样来引用它所对应的内存空间,又能在程序中比较随机地访问其他的内存空间,c+引入了指针。为了能让指针访问不同的内存空间,指针本身存放的值必须是不同的内存空间首地址。因此,指针必须是一个变量。,7.1.1数据存储,指针是一个变量,必须先声明,后使用。其声明的一般形式如下:数据类型*标识符;,7.1.2指针的声明及使用,比如:inti,*p1;,比如:int*p1;double*p2;,1.1对指针变量类型的声明,1、指针的声明,则可以使用下述赋值方法:intx5,*px=x;,等价,intx5,px=,例如:double*p2=(double*)/A,写入inta=p;/B,读取,7.1.3指针的算术运算,指针的数据类型决定了指针所指向的内存大小的空间,因此相邻两个指向的间距是“sizeof(指针数据类型)”个内存单元。指针加n的实际操作是使指针中的地址值加上sizeof(数据类型)*n指针减n的实际操作是使指针中的地址值减去sizeof(数据类型)*n,7.1.4const指针,在c+中,当用const关键字修饰指针时,可以限定指针的指向和对内存空间内容的修改,即将它们设置成常量。,1.限定内存空间的内容的改变当const关键字放在指针数据类型名的前面或后面时,即const;const;则指针指向的内存空间的内容不能改变。,2.限制指针指向的改变,当const关键字放在指针名和“”之间时,即const;则指针的值不能修改,且必须在定义的同时进行设定,此时称该指针为指针常量,且它不能为左值。例如:floatx,y;float*constp1=/合法,p1指向x的内存空间的内容可以修改,3.限定指针的指向和内存空间内容的改变,当在指针数据类型的前面或后面及在指针名和“”之间都放有const关键字时,即constconst;constconst;则由指针指向的内存空间的内容不能修改,且指针的值(指向)不可修改。,7.2指针和数组,7.2.1用指针访问数组元素,对于下面声明的数组比如:intx5;,intx5=1,2,3,4,5;/声明数组x5并初始化for(inti=0;i5;i+)/利用数组下标输出数组的全部元素coutxit;coutendl;for(i=0;i5;i+)/利用数组名输出全部元素cout*(x+i)t;coutendl;,例2,for(i=0;i5;i+)/利用指向数组的指针输出数组的元素值cout*px+t;coutendl;px=x;for(i=0;i5;i+)/利用指向数组的指针给数组元素赋值*px+=2*i;px=x;for(i=0;i5;i+)cout*px+t;coutendl;,7.2.2数组指针与指针数组,1.指针数组定义:元素为指针的数组,它的声明形式如下:数据类型*数组名常量表达式1常量表达式2;,例如:int*p16;double*p234;,例3,2.数组指针数组指针:就是一个指向数组的指针,声明形式如下:数据类型(*指针名)常量表达式1常量表达式2;,比如:int(*p)5;,例4、利用数组指针,将例3改写为:,#includevoidmain()intx23=1,2,3,4,5,6;inti,j;int(*px)3=x;for(i=0;i2;i+)for(j=0;j3;j+)coutpxijt;coutendl;,7.3指针与函数,7.3.1指针作为函数的参数,函数的某个参数是指针,对这个函数的调用就是传址调用。在进行传址调用时,函数的实参传递给形参的是一个地址,从而使得形参指针和实参指针指向同一个地址。被调函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。,*b=temp;coutAfterswap:;cout*a=*at*b=*bendl;,注:在函数的传址调用中,传递的参数的值并不改变,也即指针本身的值并不改变,改变的是它指向的值。,7.3.2返回指针的函数,定义返回指针的函数的函数头一般形式如下:数据类型*函数名(参数表),inti,j;int(*p2)2;p2=newint32;for(i=0;iy;coutchoice;coutendl;if(choice=+)pfun=add;/指针指向函数addelseif(choice=-)pfun=sub;/指针指向函数subelseif(choice=*)pfun=mul;/指针指向函数mulelseif(choice=/)pfun=div;/指针指向函数divelsecoutTheinputiserror!;return;pfun(x,y);/利用指针调用相应函数,voidadd(doublex,doubley)coutx=xty=yttx+y=x+yendl;voidsub(doublex,doubley)coutx=xty=yttx-y=x-yendl;voidmul(doublex,doubley)coutx=xty=yttx*y=x*yendl;voiddiv(doublex,doubley)coutx=xty=yttx/y=x/yendl;,7.3.4带参数的主函数main(),带有参数的main()函数的函数头形式如下:数据类型main(intargc,char*argv),7.4动态内存和void指针,7.4.1new和delete1.运算符new,使用形式如下:指针=new数据类型,比如:int*p;p=newint;,比如:int*p=newint(1);,2.运算符delete,作用:释放new请求到的内存空间。例如deletep;p=NULL;/释放由new分配的p所指向的内存空间注意:从程序的健壮性考虑,一定要在使用delete后,将指针置为0或NULL,这是一个良好的编程习惯。,new和delete的使用需要注意以下4点:,(1)new和delete必须配对使用。(2)delete必须用于先前new分配的有效指针。(3)用new给指针变量分配一个有效指针后,必须用delete先释放,然后再用new重新分配或改变指向,否则先前分配的内存空间因无法被程序引用而变成一个无用的内存垃圾,直到重新启动计算机,该内存才会被收回。(4)用new也可以为数组分配内存,这样的数组称为动态数组,格式如下:=new整形表达式,7.4.2void指针,1.void指针定义的一般格式如下:void;,2.几点说明:,比如:inta,b;int*p1=,对于:inta;int*p1=/不同类型间指针赋值错误,比如:inta;/声明int型变量int*p1=/void指针通过强制类型转换给int型指针赋值,/正确,void指针的使用举例,#includevoidmain()inta(1);int*pa1=,例7.4.2,7.5引用,在声明引用时需要同时初始化:其声明的一般形式如下:数据类型&引用名=变量名;或数据类型&引用名(变量名);,注:1.被引用的变量可以是任意类型。2.引用声明的真正含义是为一个内存空间另起一个标识符,而不仅是为变量起一个别名。,7.5.1引用的声明和操作,7.5.2把引用用作

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论