2.3 复合类型

复合类型是指基于其他类型定义的类型。
一条声明语句由一个基本数据类型和紧随其后的一个声明符列表组成

2.3.1 引用

引用为对象起了另外一个名字,引用类型引用另外一种类型。
引用的定义
允许在一条语句中定义多个引用,其中每个引用的标识符都必须以符号&开头;
ex:int i=1024,i2=2048; // i和i2都是int
int &r=i, r2=i2; // r是一个引用,与i绑在一起,r2是int
int i3=1024,&ri=i3; // i3是int,ri是一个引用,与i3绑在一起
int &r3=i3, &r4=i2; // r3和r4都是引用

2.3.2 指针

指针与引用相比又有很多不同点
1.指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
2.指针无须在定义是赋值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。

获取对象的地址

指针存放某个对象的地址,要想获取该地址,需要使用取地址符(操作符&)
ex:int *ip1, *ip2;
int *p=&ival; //p存放变量ival的地址,或者说p是指向变量ival的指针。

指针值

指针的值(即地址)应属于下列四种状态之一:
1.指向一个对象。
2.指向紧邻对象所占空间的下一个位置。
3.空指针,意味着指针没有指向任何对象。
4.无效指针,也就是上述情况之外的其他值。

利用指针访问对象

解引用操作仅适用于那些确实指向了某个对象的有效指针。
int i = 42;
int &r = i;//& 紧跟类型名,是声明符列表的一部分,r 是一个引用
int *p = &i;//* 出现在类型名后的声明符列表中,p 是一个指针;& 出现在表达式中,是一个取地址符
*p = 40;//* 出现在表达式中,是一个解引用符

空指针

空指针不指向任何对象
int *p = nullptr;//等价于*p = 0;
int *p = 0;
int *p = NULL;//在头文件cstdlib 中定义,在新标准下尽量避免使用NULL

把int 直接赋值给指针是错误的操作,即使int 变量的值恰好等于0 也不行。
将合法指针(有效指针)用于条件表达式时:
只当指针为空指针时,条件才为false。

void* 指针

void* 指针是一种特殊的指针类型,可用于存放任意对象的地址。
但不能直接操作void* 指针所指的对象,因为我们不知道该指针所指对象的类型,更不知道该类型可以进行哪些合法的操作。

2.3.3 理解复合类型的声明

定义多个变量

通过的个数可以区分指针的级别, *表示指向指针的指针

int i = 0;
int *p = &i;//p 是指向整形i 的指针
int **q = &p;//q 是指向指针p 的指针
int *&r = p;//r 是对指针p 的引用
int **&t = q;//t 是对指针q 的引用

不存在引用的引用,也不存在指向引用的指针(引用本身不是对象)。
面对一条比较复杂的指针或引用的声明语句时,从右往左阅读有助于弄清楚它的真实含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值