复合类型
复合类型是基于其他类型定义的类型。
C++中最常用的复合类型是引用和指针。
一、引用
引用是给对象起的别名,它代表了对象,但它不是一个对象。
一般在变量初始化时,初始值会被拷贝到新建的对象中,然而在定义引用时,程序将引用和它的初始值绑定在一起,一旦初始化完成,引用将和它的初始对象一直绑定在一起,无法令引用重新绑定到另一对象,因此引用必须初始化。
引用的类型要与绑定的对象类型严格匹配,且只能绑定在对象上,不能绑定字面值(const除外)。
格式为: type &引用名 = type类型的对象名;
二、指针
1. 指针与引用的不同
\ | 指针 | 引用 |
---|---|---|
自身类型 | 对象 | 别名 |
初始化 | 可以不初始化 | 必须初始化 |
是否可以表示不同对象 | 是 | 否 |
2.指针的定义
指针存放的是某个对象的地址。
- 无初始化的定义 格式: type *指针名;
- 有初始化的定义 格式: type *指针名 = & type类型的对象; &为取地址符,获取当前对象的地址;
- 空指针的定义 格式: type *指针名 = 0;
type *指针名 = NULL;
type *指针名 = nullptr;
以上定义空指针的三种方法,都是将0赋值给指针。其中最常用的是nullptr,它是一种特殊类型的字面值,可以被转换成任意指针类型。
建议在定义指针时初始化所有指针,防止程序因未初始化指针而崩溃。例如:指针未被初始化,分配给指针的内存中有数据,则该数据会被当做是地址值。访问该指针,则会访问本不该去访问的地址。
3.利用指针访问对象
我们利用解引用符*来访问被指针指向的对象(若指针没有赋值,则不能解引用)。
*p(p为指针名)的含义为:p所指向的地址内的元素。
4.void*指针
void*是一种特殊类型的指针,可以指向任意类型的对象。
格式: void *指针名 = &任意类型;
但是,由于不知道指针指向对象的类型,我们无法对对象进行操作(包括取出对象)。
三、复合类型的定义
1.定义多个变量
在定义复合类型的多个变量时,容易产生误解。首先,要知道,变量声明是由 基本数据类型和声明符组成的。
例如:int* p1,p2; 在这条语句中,int为基本数据类型,*是修饰p1的类型修饰符,对p2没有任何影响。因此,这条语句声明了int类型的指针p1、变量p2。
2.指针的指针
通过修饰符*的个数可以区分指针的级别。相对的,在解引用时也要根据需要调整解引用符的个数。
int a = 10;
int *b = &a;
// c为指针b的指针
int **c = &b;
std::cout << **c << std::endl;
3.指针的引用
int i = 42;
int *p;
// r为指针p的引用
int *&r = p;
面对一条复杂的指针或引用声明语句时,将变量名定为起点,从右向左读,离变量名最近的修饰符影响该变量的类型,其余剩下的为该变量引用或指向的类型。