1、C++中有很多的符合类型:我们这里讲到了常用的两种 “ 引用 和 指针 ”
引用的定义:为对象起了另外一个名字,引用类型引用另外一种类型。因为引用本身不是一个对象,所以不能定义引用的引用。允许在一条语句中定义多个引用,其中每个引用表示符都必须以符号&开头。
例子:int ival=1024;
int &refVal=ival; //refVal指向ival(是ival的另一个名字)
int &refVal2; //报错:引用必须被初始化
2、指针与引用之间的区别
其一:指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象。
其二:指针无须在定义时赋初值。和其他内置类型一样,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值。
例子:int *ip1, *ip2 ;// ip1 和 ip2 都是指向int型对象的指针。
double dp, *dp2;// dp2 是指向 double 型对象的指针,dp是 double 型对象。
3、关键概念
像&和*这样的符号,既能用作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义:
int i =42;
int &r = i; //&符号紧随类型名出现,它是声明的一部分,r是一个引用。
int *p; //*符号紧随类型名出现,它是声明的一部分,p是一个指针。
p = &i; //&符号出现在表达式之中,是一个取地址符号。
*p = i; //*符号出现在表达式之中,是一个解引用符。
int &r2=*p;//&是声明的一部分,*是一个解引用符。
4、空指针
(1)概念:空指针不指向任何对象。
(2)生成空指针的方法:
(a)int *p1=nullptr; //等价于int *p1=0;
(b)int p2=0; //直接将p2初始化为字面常量;
(c)#include cstdlib
int *p3=NULL; //等价于int *p3=0;
注意(1)得到空指针最直接的办法就是字面值nullptr来初始化指针。
(2)另一种办法就是如对p2的定义一样,也可以通过指针初始化为字面值0来生成指针。
注意:记住赋值永远改变的是等号左侧的对象。
5、合法指针
两个类型相同的合法指针,可以用等号操作符(==)或者不相等操作符(!=)来比较他们,比较的结果是布尔型。如果两个指针存放的地址值相同,则他们相等;反之他们不等。需要注意的是:两个指针存放的地址相同(两个指针相等)有三种可能:他们都为空、都指向同一个对象、或者都指向了同一对象的下一地址。有时候一个指针指向某对象,同时另一指针指向另外对象的下一地址,此时也可能出现两个地址相同的情况,即指针相等。
6、void*指针
void*是一种特殊的指针类型,可用于存放任意对象的地址。
7、假设p是一个int型指针,请说明下述代码含义。
if(p)//...... p指针是否为空指针
if(*p)//...... p指针所指向的对象是否为0
8、下面这段代码中为什么p合法lp非法?
int i=42; void *p=&i; long *lp=&i;
因为:lp的类型不是int,而void定义了一个空指针,可以存放任意类型的对象。