- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
c(指针和引用)
指针与引用
指针是C++中的一个重要概念,利用指针,可以操纵数据对象的内存地址,实现对数据对象的间接访问,表示复杂的数据结构,编写简洁高效的程序。
引用是某个数据对象的别名,C++中引进引用这一概念的目的是为了简化函数调用时的参数传递,因此,引用经常出现在函数的参数和返回值中。
一 指针与指针变量的概念
1、指针的基本概念
计算机内存由一系列的内存单元(在微型计算机中通常是一个字节)构成,这些内存单元被连续地编址。于是,每个内存单元有一个惟一的地址。
在程序执行过程中,对于程序中定义的每个变量,C++系统会根据变量的类型,在内存中分配由若干个地址连续的内存单元组成的存储单元,用于存放变量的值。变量的类型不同,存储单元的大小(内存单元数)也不相同。
我们把某变量的存储单元的首内存单元的地址称为该变量的地址,可以用地址运算符“”来获取变量的地址。例如,若定义
int k=3;
float f=3.14;
则k表示变量k的地址,f表示变量f的地址。由于变量的地址指明了变量的存储位置,所以被说成是“指向”变量,并形象地称为变量的指针。
另外,我们可以定义变量来存放某个数据对象的指针,这种用来存放数据对象指针的变量称为指针变量。如果指针变量P中存放了数据对象v的地址(指针),则称p指向数据对象v,或者称p是指向数据对象v的指针变量。
这样一来,我们访问内存中的数据对象就有了两种方法。
第一种是用变量名访问。由于编译系统在对源程序编译时,会自动将变量名映射为它所在的存储单元的地址。因此,用变量名访问时,用户不必关心变量的实际地址,只要在程序中给出变量名,由计算机将变量名映射为内存地址,再有地址对内存中的数据对象进行存储。
另一种是用指针访问,即利用指向数据对象的指针变量来访问。具体地说就是,先由指针变量的值得到数据对象的存储地址,再根据该地址来存取数据对象。很显然,这是一种间接访问方式。
值得特别注意的是,虽然指针变量和普通变量都代表内存中的某个存储单元,在内存中都被映射为地址,但是普通变量的存储单元中存放的是数据,而指针变量的存储单元存放的是地址。
2 定义指针变量
C++规定所有变量在使用前务必先定义,指针变量也不例外。定义指针变量的语法格式如下:
类型 *指针变量名1,*指针变量名2,…,*指针变量名m;
其中,“*”是说明符,说明其后的标志符是个指针变量,“类型”表示本指针变量所指向的数据对象的数据类型。例如:
int *p1; //p1是一个指向int型数据对象的指针变量
float *p2; //p2是一个指向float型数据对象的指针变量
char *p3; //p1是一个指向char型数据对象的指针变量
另外,还可以在定义指针变量的同时,对其进行初始化,使其指向某一数据对象。例如:
int k,*p1=k; //p1指向int型变量k
在对指针初始化时,要先定义对象。比如下例就是错误的:
char *p3=c,c; //错误
这是因为编译char *p3=c时,变量c还未安排存储单元,它的地址不存在。
在C++程序中,我们还可以根据需要,用赋值的方法不断改变指针变量指向的数据对象。例如:
int a,b,c,*p1=a;
…
p1=b;
…
p1=c;
但是,要注意的是一种类型的指针只能指向同类型的数据对象。例如:
int *p;
char c;
p=c;//错误。p为int型,c为char型
是错误的。原因在于int型的指针指向了char型数据对象。同样地,不同类型指针之间不能进行赋值操作。例如:
int a,*p1;
char c,*p2=c;
p1=p2;
是错误的。如果必须把p2的值赋给p1,使p1指向char型变量c,可以通过强制类型转换的方法。
p1=(int *)p2;
有人可能会问,既然任何类型的指针都可以指向内存中的任一位置,为什么还要规定指针的数据类型呢?因为指针的所有运算都与它指向的数据对象的类型密切相关,所有C++规定一种类型的指针只能指向同类型的数据对象。
3 用指针访问变量
在用初始化或赋值方式使指针变量指向某一数据对象后,我们可以借助于指针运算符“*”(或称间接访问运算符)来存取该数据对象。指针运算符“*”的语法格式为:
* 指针变量
它用来表示指针变量所指向的同类型的数据对象。例如:
int a=3,b=2,c=1,*p=a;
cout*p; //p指向a,*p表示a
p=b;
cout*p; //p指向b,*p表示b
p=c;
cout*p; //p指向c,*p表示c
该程序的输出结果是:321。
对于指向结构体变量(或共用体变量)的指针,可以使用成员运算符“.”或指向运算符“-”,来访问它所指向的结构体变量(或共用体变量)的成员。例如:
文档评论(0)