复合类型是基于其它类型定义的类型,如指针和引用。
引用
- 引用是为对象起了另外一个名字,引用类型引用另外一种类型。
- 定义引用类型时必须初始化。
- 定义引用类型时,程序把引用和它的初值绑定在一起,而不是将初始值拷贝给引用。
- 引用一旦初始化就将和它的初值永远的绑定在一起,不能再将引用绑定到另外的对象。
- 定义一个引用后,对于引用的任何操作实质上都是对引用绑定对象的操作。
- 引用不是一个对象,所以不能定义引用的引用。
- 引用只能绑定到对象上,而不能与字面值或某个表达式的计算结果绑定。
- 引用的类型必须与它绑定的对象严格匹配。
指针
- 指针本身就是一个对象,所以存在指向指针的指针。
- 在指针的声明周期里可以指向几个不同的对象。
- 定义指针时不一定必须赋值,定义在块作用域内的指针如果没有被初始化,将拥有一个不确定的值。
- 指针类型要和它所指向的对象严格匹配。
指针的值
- 指向一个对象。
- 指向紧邻对象所占空间的下一个位置。
- 空指针,意味着指针没有指向任何对象。
- 无效指针,除了上述情况以外的其他值。
试图拷贝或以其它形式访问无效的指针的值都将引发错误。
空指针
空指针不指向任何对象,试图使用一个指针之前代码可以先检查它是否为空。
生成空指针的方法:
int *p = nullptr; //C++ 11新标准
int *p = 0;
int *p = NULL; //需要包含头文件<cstdlib>
指针的一般操作
- 只要指针拥有一个合法的值,就可以将其用在条件表达式中,任何非0的指针对应的条件值都是
true
。 - 对于两个类型相同的合法指针,可以用
==
、!=
操作符对其进行比较。两个指针相等的情况:- 它们都是空指针。
- 它们都指向同一个对象。
- 它们都指向同一个对象的下一个地址。
void* 指针
void*
指针是一种特殊的指针类型,可用于存放任意对象的地址。
不能直接操作 void*
所指向的对象,因为并不知道这个对象究竟是什么类型,也就无法确定能在这个对象上做哪些操作。
利用 void*
指针可以做事:
- 拿它和别的指针比较
- 作为函数的输入或输出
- 赋给另一个
void*
指针。
理解复合类型的声明
定义多个变量
int *p1,p2; //p1是指向int的指针,p2是int
int *p1,*p2; //p1,p2都是指向int的指针
指向指针的指针
通过*
可以区别指针的级别,**
表示指向指针的指针,***
表示指向指针的指针的指针。
指向指针的引用
引用本身不是对象,因此不能定义指向引用的指针。但是指针是对象,所以可以定义指针的引用。
int i = 42;
int *p;
int * &rp = p; //rp是一个对指针p的引用
rp = &i; //rp是引用,因此给rp赋值&i就是让p指向i
*rp = 0; //解引用rp得到i,也就是将i的值修改为0