版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章指针和引用.指针是一种特殊的数据类型。指针概念是C++语言中较难理解和较难掌握的概念之一。本章介绍指针的概念、定义、运算等内容。
指针变量是一种特殊的变量,变量中存放的不是某种数据类型的数据,而是另一个变量或常量的地址。§5.1指针概念如有定义:intvalue=150;charch=‘M’;并执行赋值语句:pv=&value;pc=&ch;//pvholdstheaddressofvalue由于pv中存放的是value变量的地址,pc中存放的是ch变量的地址,故称pv和pc为指针变量。简称为指针〔Pointer〕。.指针指向的对象称为目标或目标变量〔常量〕。如图7.1所示:…150…‘M’…
…valuechpvpc*pv*pc图1内存空间1000H1050H0000H&value1000H1001H&ch1050H&pc11A2H11A3H11A1H&pv11A0H.C++规定:目标或目标变量可以用指针变量名前加上运算符“*〞表示。pv的目标变量value可表示为*pv,pc的目标变量ch可表示为*pc,即*pv和value等效*pc和ch等效而&pv和&pc表示针变量本身的地址,当指针变量为2个字节时,最大访问地址为:指针的定义指针变量也必须先定义后使用定义的一般格式:类型定义符*指针变量名;其中:类型定义符——指针指向对象的数据类型“*〞——说明符,表示其后的标识符是指针变量,而不是一般变量。.例如:
int*ptr;char*name;float*pf;其中,定义ptr,name,pf分别为指向整型、字符型和浮点型数据的指针。
constint*ptr;//pointertointconstconstchar*cpcconstfloat*point其中,ptr,cpc,point为指向常量的指针。注意:指针变量可以与其他变量一起定义,如:
inta,bb,*c;char*p,*q,ch;指针变量也可定义为全局,静态和局部的指针。.例如:intnum,*pn;charcolor,*pc;执行语句pn=#pc=&color;那么在程序中*pn=100;等效于num=100;*pc=‘r’;等效于color=‘r’;这里,“*〞作为访问目标变量的运算符,在定义指针时,“*〞作为说明符。注意使用上的区别。§5.2指针赋值使用指针前,必须给已定义指针变量赋以指向目标变量的地址值。“&〞操作符可获取变量的地址。.指针赋值的几种情况:同种数据类型的指针变量之间可以相互赋值。
inta,*pa,*pb;pa=&a;pb=pa;//pa,pbholdsthesameaddressofa指针变量可以赋初值:
inta,b,c;int*pa=&a,*pc=&c;指针可初始化为空指针
char*p=NULL;指针变量的类型名与指向目标的数据类型一致。
例如:
int*p,a;floatb,*q;p=&b;q=&a;//错误
p=&a;q=&b;//正确.例:有关指针概念的程序//ex5_3.cpp#include<iostream.h>voidmain(){intw,*p=&w;*p=800;cout<<"w="<<w<<'\t'<<"&w="<<&w<<endl;cout<<"*p="<<*p<<'\t'<<"&p="<<&p<<endl;cout<<'\t'<<"p="<<p<<endl;}结果:
w=800&w=0x0012FF7C*p=800&p=0x0012FF78p=0x0012FF7C指针变量的地址指针也是变量,指针变量的地址是指它本身的内存地址,如图1所示。.图示如下:0012:FF7C(&w)800pw0012:FF7C*p0012:FF78(&p)§5.3指针运算指针运算实质上是地址运算。1、赋值运算2、取地址运算“&〞〔addressof〕和取内容运算“*〞〔Dereference〕,“&〞和“*〞互为逆运算,例如:intx,*ptr=&x;那么&(*ptr)表示指针ptr*(&x)表示变量x图2.3、指针与整数的加减运算在数组中,指针变量加上或减去一个整数n,表示:指针由当前所指向的位置向前或向后移动n个数据元素的位置。移动后的实际地址为:p±n*sizeof(数据类型)4、指针的关系运算指向同种数据类型的指针可作关系运算,表示它们所存放的地址之间的关系。<,>,==,!=指针运算例如:课本P57例4.2.//ex5_2a.cpp#include<iostream.h>voidmain(){ inta[10],*p,*q; cout<<"a="<<a<<endl; cout<<"a+1="<<a+1<<endl; cout<<"a+2="<<a+2<<endl; p=&a[5]; q=p; p++; q--;
cout<<"p="<<p<<endl;cout<<"q="<<q<<endl;p=&a[2];q=&a[6];cout<<"q-p="<<q-p<<endl;cout<<"p="<<p<<endl;cout<<"q="<<q<<endl;cout<<"p+4="<<p+4<<endl;}.例//ex5_3.cpp#include<iostream.h>voidmain(){ char*p1,*p2; p1="CProgram"; p2=p1+8; while(p2>=p1) { cout<<*p2; p2--; } cout<<endl;}'m''a'…'r''g''o''r''P''''C'…p1p2.§5.4指针与数组C++规定定义一个数组时,用数组名存放该数组在内存中的首地址。
当把数组名赋予一个指针变量后,该指针指向数组,可以通过指针移动方式访问数组元素。
例如:inta[20],*p;p=a;那么下标为i的元素可表示为:a[i],*(a+i),p[i],*(p+i),对应地址可表示为:&a[i],a+i,&p[i],p+i注意:数组名是指针常量,不是指针变量,不能给数组名赋值。.数组元素的表示方法例如.例如:下面程序是用指针方式访问数组元素,计算数组元素之和。
#include<iostream.h>voidmain(){intiarray[10]={0,2,4,6,8,10,12,14,16,18};intsum=0;int*iptr=iarray;//指针初始化for(inti=0;i<10;i++){sum+=*iptr;iptr++;}cout<<“sumis“<<sum<<endl;}运行结果为:sumis90.例如:对于前例中数组的求和元素运算,可以有以下五种方法:#include<iostream.h>intsum1,sum2,sum3,sum4,sum5;intiarray[]={1,4,2,7,13,32,21,48,16,30};int*iptr;voidmain(){intsize,n;size=sizeof(iarray)/sizeof(*iarray);for(n=0;n<size;n++)//方法1{sum1+=iarray[n];}.
iptr=iarray;//方法2for(n=0;n<size;n++)
{sum2+=*iptr++;
}iptr=iarray;//方法3for(n=0;n<size;n++)
{sum3+=*(iptr+n);
}iptr=iarray;//方法4for(n=0;n<size;n++)
{sum4+=iptr[n];
}for(n=0;n<size;n++)//方法5
{sum5+=*(iarray+n);
}cout<<sum1<<endl;cout<<sum2<<endl;cout<<sum3<<endl;cout<<sum4<<endl;cout<<sum5<<endl;}答案为:174174174174174.一、字符数组数组中每个元素为字符的数组称为字符数组,字符数组可用单个字符常量初始化,也可用字符串常量初始化,例如:charbuffer[]=“hello〞;二、字符串常量在C++中,字符串常量是由双引号括起的一串字符。字符串常量通常存放在dataarea的const区中,并以‘\0’作为结束符,编译器记下其起始地。即:地址代表了这个字符串常量。由于字符串常量的地址属性,所以由相同字符组成的字符串常量是两个不同起始地址的字符串常量。§5.5字符指针.三、字符指针指向字符类型的指针称为字符指针。字符串常量和字符数组名都具有地址特性,当把它们赋给一个字符指针后,编译器规定:输出字符指针就是输出字符串;输出字符指针指向的对象,就是输出单个字符。.例如:#include<iostream.h>voidmain(){charbuffer[10]=“ABC〞;char*pc;pc=“hello〞;cout<<pc<<endl;//输出hellopc++;cout<<pc<<endl;//输出ellocout<<*pc<<endl;//输出epc=buffer;cout<<pc;//输出ABC}.四、字符串比较字符串比较是指两个字符串进行逐个字符的一一比较。通常使用在string.h头文件中定义的strcmp()函数,其原型为:intstrcmp(constchar*str1,constchar*str2);其返回值:(1)当str1串等于str2串时,返回值0;(2)当str1串大于str2串时,返回一个正值;(3)当str1串小于str2串时,返回一个负值。.五、字符串赋值C++中,可以使用在string.h中定义的标准函数strcpy()对字符数组进行赋值。函数原型为:char*strcpy(char*dest,constchar*src);返回值为dest值。例如:charbuffer1[10];charbuffer2[10];strcpy(buffer1,〞hello〞);strcpy(buffer2,buffer1);字符串常量“hello〞赋给字符数组buffer2。.一、定义一个数组中假设每个元素都是一个指针,那么称为指针数组。例如:定义一个指针数组并初始化char*proname[]={“FORTRAN〞,“C〞,“C++〞};该数组的每个元素是指向字符串常量的字符指针,指针指向的字符串常量存放在dataarea的const存储区中,可能连续,也可能不连续。§5.6指针数组.该字符数组的内存表示如下:0088:22510088:22590088:225B0067:44000067:44020067:44040088:2251‘F’‘O’‘R’‘T’‘R’‘A’‘N’‘\0’‘C’‘\0’‘C’‘+’‘+’‘\0’……0088:22522253225422552256225722582259225A225B225C0088:225D0088:225EChar*proname[].二、指针数组与二维数组字符指针数组与字符二维数组的主要不同之处是:字符指针数组元素指向的字符串可以是不规那么的长度。字符二维数组的每个元素的长度必须相同,在定义时已确定。例如:上例中proname[0]→8个字节字符串proname[1]→2个字节字符串proname[2]→4个字节字符串总字节数为6+14=20在二维数组中:charname[3][8]={“FORTRAN〞,“C〞,“C++〞};共需3×8=24个字节。可见使用字符指针数组更灵活方便。.三、指向指针的指针如果在一个指针变量中存放的是另一个变量的指针的地址,称该指针为指向指针的指针,即二重指针。例如:以下图中P是二重指针&q&v120p指针q指针v变量*p**p.如下面定义:char*pc[]={“abc〞,“def〞,“hig〞};char**ppc;//定义ppc为二重指针ppc=pc;显然指针数组名pc就是一个二重指针。例如下面的程序把字符指针数组作为实参进行函数调用:#include<iostream.h>voidprint(char*[],int);voidmain(){char*pn[]={“Fred〞,“Barney〞,“Wilma〞,“Betty〞};intnum=sizeof(pn)/sizeof(char*);//求数组元素个数(8/2)print(pn,num);//数组名pn为二重指针作为实参数进行函数调用}.四、NULL指针NULL是空指针。在C++中,NULL取值为0,常常用以表示指针不指向任何地方的一种状态。void*表示指针指向的目标对象无数据类型。注意两者的区别。.在程序中,引用可作为目标变量或对象的别名而使用,对引用的操作实际上就是对目标变量或对象的操作。建立引用的方法:
intvalue;int&rvalue=value;//rvalueinitialized说明rvalue是对整型数据的引用,并初始化为整型变量value的引用。§5.7引用的概念Areferenceisanalternativenameforvariableorobject.Toensurethatareferenceisboundtoavariablenameoranobjectname,wemustinitializethereference..注意1、引用在说明时必须初始化,初始化变量必须是已定义的变量;2、引用不是变量,只是替代某个变量的别名;3、引用不占内存空间,引用的地址与绑定的变量相同。在程序中对引用的访问就是对其绑定的变量的访问。.#include<iostream.h>voidmain(){intintone;int&rint=intone;intone=5;cout<<“intone=〞<<intone<<endl;cout<<“rint=〞<<rint<<endl;rint=25;cout<<“intone=〞<<intone<<endl;cout<<“rint=〞<<rint<<endl;}运行结果为:
intone=5rint=5intone=25rint=25例如:下面程序说明引用与其绑定的变量之间的关系。.注意:引用运算符与取地址运算符使用了相同符号“&〞,但使用场合不同,意义不同;引用运算符“&〞仅在说明一个引用时使用,放在类型名后面,表示是该数据类型的引用;在程序中,“&〞作为取地址操作运算符,放在变量前面。例如:intcount;int&sum=count;//引用说面intcount;int*ip=&count;//取地址,对指针初始化cout<<&ip;//输出变量ip的地址cout<<&count;//输出变量count的地址.如果程序中取引用的地址,它返回引用绑定的目标变量的地址;(2)对引用赋值,就是对绑定的目标变量的赋值;(3)假设说明一个引用为T&,那么引用必须用类型T的目标变量,或能转换成类型T的目标变量进行初始化。例如下面的说明语句是合法的,double&rr=1;因为整型1可以转换为double,此种情况下:首先作必要的类型转换;然后将结果置于临时变量;最后把临时变量的地址作为初始化的值。所以该说明语句可以解释成:doubletemp;temp=double(1);double&rr=temp;§5.8引用的操作.(4)可以说明对指针变量的引用,例如:
int*a;int*&p=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学教学计划模板集锦八篇
- 2024年网络平台运营授权合同
- 2025年汽车底涂项目提案报告模板
- 我读书我快乐的演讲稿汇编15篇
- 财务人员试用期转正自我鉴定4篇
- 教师教学工作总结15篇
- 骆驼祥子读书心得体会范文
- 《西游记》读书笔记合集15篇
- 消防栓检查记录卡(完整版)
- 2024秋九年级化学上册 第六单元 碳和碳的氧化物 课题1 金刚石、石墨和C60第1课时 碳单质的物理性质和用途教学思路2(新版)新人教版
- 2024-2025学年北师版八年级物理上册期末考试综合测试卷
- 【MOOC】国际商务-暨南大学 中国大学慕课MOOC答案
- 人教版八年级英语上册期末专项复习-完形填空和阅读理解(含答案)
- GB/T 44592-2024红树林生态保护修复技术规程
- 2023-2024学年广东省广州市白云区八年级(上)期末数学试卷及答案解析
- ISO13485基础知识培训讲义(共48页).ppt
- 解除(终止)劳动合同证明书(新版)
- 插床机械基本原理
- 大管轮见习记录簿范本汇总
- 《医学细胞生物学》期末考试试卷附答案
- 万能中国地图模板(可修改)
评论
0/150
提交评论