1、指针和引用的区别
(1)引用必须被初始化(引用类型的初始值必须是一个对象),指针不必(但最好要初始化)。
(2)引用初始化以后不能被改变,指针可以改变所指的对象。
(3)不存在指向空值的引用,但是存在指向空值的指针。
(4)指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。
(5)指针是一个对象,可以定义指向指针的指针。但引用不是对象,没有实际地址,所以不能定义指向引用的指针,也不能定义指向引用的引用。
例1:
int &a = 10; //错误,引用类型的初始值必须是一个对象
double a = 3.14;
int & b = a; //错误,此处的引用类型的初始值必须是int型的对象
例2:
int i = 45;
int* p; //p是一个int型的指针(可以把int*当成是一个类型)
int* &r = p; //r是一个对指针p的引用(r是一个引用,它的类型为int*)
r = &i; //r引用了一个指针,因此给r赋值&i就是令p指向i
*r = 0; //解引用r得到i,也就是p指向的对象,将i的值改为0
2、指针的值(即地址)应属下列4中状态之一:
- 指向一个对象。
- 指向紧邻对象所占空间的下一个位置。
- 空指针,意味着指针没有指向任何对象。
- 无效指针,也就是上述情况之外的其他值。
3、某些符号有多重含义:
如&和*这样的符号,即能用作表达式里的运算符,也能作为声明的一部分出现,符号的上下文决定了符号的意义:
int i = 45;
int & i = i; //&紧随类型名出现。因此是声明的一部分,r是一个引用
int *p; //*紧随类型名出现。因此是声明的一部分,p是一个指针
p = &i; //&出现在表达式中,是一个取地址符
*p = i; //*出现在表达式中,是一个解引用符
int &r2 = *p; //&是声明的一部分,*是一个解引用
4、void * 指针
void *指针是一种特殊的指针,可用于存放任意对象的地址,但该地址中到底是个什么类型的对象并不了解,因此不能直接操作void*指针所指的对象。
例:
double obj = 3.14, *pd = &obj;
void * *pv = &obj; //obj可以是任意类型的对象
pv = pd; //pv可以存放任意类型的指针
void*指针的用途:
- 拿它和别的指针比较;
- 作为函数的输入过输出;
- 赋给另一个void *指针