C++:复合类型(引用、指针...)
在C++中,一条声明语句由一个基本数据类型(base type)和紧随其后的一个声明符(declarator)列表组成。每个声明符命名了一个变量并指定该变量为与基本数据类型有关的某种类型。
引用和指针都属于复合类型(复合类型指的是基于其他类型定义的类型)。
引用(reference)
引用即别名,必须被初始化。在定义引用时,程序吧引用和它的初始值绑定在一起,而不是将初始值拷贝给引用。引用并非对象,它只是一个已经存在的对象的另一个名字。而正是因为引用不是对象,故不能定义引用的引用。
1 int i = 1024, i2 =2048; //i和i2都是int 2 int r &r = i, r2 =i2; //r是一个引用,与i绑定在一起,r2是int 3 int i3 = 1024, &ri = i3; //i3是int,ri是一个引用,与i3绑定在一起 4 int &r3 = i3, &r4 = i2; //r3和r4都是引用
指针(pointer)
指针与引用的不同:
1,指针本身是对象,这就允许对指针进行赋值和拷贝。
2,指针无需在其定义的时候赋初值,而和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的初始值。
定义指针类型的方法是将声明符写成*d的形式,其中d是变量名。如果在一条语句中定义了几个指针变量,每个变量前面都必须有符号*。
获取对象的地址
要想获得对象的地址需要使用取地址符(&)
double dval; double *pd = &dval; //正确:初始值是double型对象的地址 double *pd2 = pd; //正确:初始值是指向double对象的指针 int *pi = pd; //错误:指针pi的类型和pd的类型不匹配 pi = &dval; //错误:试图把double型对象的地址赋给int型指针
利用指针访问对象
如果指针指向了一个对象,则允许使用解引用符(操作符 * )来访问该对象。对指针解引用可以得出所指的对象,如果给接语音的结果赋值,实际也就是给指针所指的对象赋值。
需要说明的是借我用用操作仅仅适用于那些确实指向了某个对象的有效指针。
指针值
指针值应该处于下列四种状态之一
1,指向一个对象。
2,指向紧邻对象所占空间的下一个位置。
3,空指针,意味着指针没有指向任何对象。
4,无效指针,也就是上述 情况之外的其他值。
对于4,任何拷贝及试图访问都将引发错误。
对于2、3,仍然受到限制,因为这些指针没有指向任何具体的对象,所以试图访问此类指针(假定的)对象的行为不被允许。
空指针
不指向任何对象,生成方法有
int *p1 = nullptr; //等价于int *p1 = 0; int *p2 = 0; //直接将p2初始化为字面常量0 //需要首先#include cstdlib int *p3 = NULL; //等价于 int *p3 = 0;
NULL为预处理变量,该变量在头文件cstdlib中被定义,其值为0。
void*指针
void*指针是一种特殊的指针了我i下,可以存放任意对象的地址。该指针中同样存储着一个地址,但不同的是我们不能得知该地址中存放的变量类型。