(7)复合类型(指针和引用)

复合类型:基于其他类型定义的类型。C++的复合类型有很多,这一节介绍“引用”和“指针”。

引用:为对象起了另外一个名字,引用类型引用另外一种类型。通过将声明写成&d的形式来定义引用类型,其中d是声明的变量名:
int a =2;
int &d = a;
定义引用时,程序把引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。可以说引用即别名,它只是为一个已经存在的对象所起的另外的名字。因为引用本身不是一个对象,所以不能定义引用的引用。而且引用一旦和它的初始值对象绑定,就无法重新绑定到另外一个对象上。

引用的要求:
1)只能绑定在对象上,不能绑定字面值或者表达式的计算结果。

2)引用和对象的类型要想同。


引用的类型要求能和与之绑定的对象严格匹配,但是两种例外:

一.初始化常量的引用时允许用任意表达式作为初始值,只要该表达式的结果能转化成引用的类型即可。

二.基类的引用可以绑定到派生类对象上。


指针:是“指向”另外一种类型的复合类型。定义指针类型的方法是将声明符写成*p,其中p为变量名:
int  *p;

指针存放某个对象的地址,要想获取改地址,需要使用取地址符(&):
int d = 42;

int *b = &d; 

指针的类型要求能和与之绑定的对象严格匹配,但是两种例外:

一。允许一个常量的指针指向一个非常量对象。

二.基类的指针可以绑定到派生类对象上。



指针值得四种状态:
1)指向一个对象
2)指向紧邻对象所占空间的下一个位置
3)空指针,意味着指针没有指向任何对象
4)无效指针,也就是上叙情况之外的其他值

利用指针访问对象:
如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象:
int  a = 39;
int  *p = &a;
cout<<*p;  //得到39
如果给解引用的结果赋值,实际上也就是给指针所指的对象赋值:
*p = 0;
cout<<*p;   //得到 0 

空指针:不指向任何对象。得到空指针最直接的方法是用字面值nullptr来初始化指针.

以下列出几个生成空指针的方法:
int *p1 = nullptr;
int *p2= 0;
int *p3 = NULL //需要 #include<cstdlib>

和变量一样如果使用未初始化的指针将引发错误,通常造成程序崩溃!所以指针在使用前建议进行初始化。指针除了初始化还可以进行赋值,因为指针是一个对象,指针赋值后指向的是新的对象,这点和变量一样。

void* 指针:
void*是一种特殊的指针类型,可用于存放任意对象的地址,但是利用void*指针能做的事比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针,不能直接操作void*指针指向的对象,因为我们并不知道这个对象到底是什么类型,也就无法确定在这个对象上做哪些操作。

指向指针的指针:
通过*的个数可以区分指针的级别。也就是说,**表示指向指针的指针,***表示指向指针的指针的指针以此类推:
int    d = 42;
int   *p = &d;
int **pp = &p;

指向指针的引用:
引用本身不是一个对象,因此不能定义指向引用的指针。但是指针是对象,所以存在对指针的引用:
int *p;
int*&r = p;

引用和指针的异同:
  同:实现对其他对象的间接访问。
  异:
    1)引用不是对象,定义时必须赋初值,而且必须绑定在一个对象实体上,不允许赋值拷贝,不存在引用的引用。
    2)指针是对象,定义时无须赋初值,可以复制和拷贝,可以定义多层指针,可以定义指向指针的引用。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值