1.引用
引用就是对象的另一个名字,在实际的程序中,引用主要用作函数的形式参数。引用是一种复合类型,通过在变量名前添加“&”符号来定义。
复合类型是指用其他类型定义的类型。在引用的情况下,每一种引用类型都“关联到”某一其他类型。引用必须用与该引用同类型的对象初始化。当引用初始化后,只要该引用存在,它就保持绑定到初始化时指向的对象,不可能将引用绑定到另一个对象。
const 引用时指向const对象的引用,具体介绍参见const介绍文章。
下面是引用用法的一些例子:
int ival = 1024;
int &refVal = ival;
int &refVal2; //错误
refVal+=2;
int i = 1024,i2 = 2048;
int &r = i,&r2 = i2;
const int ival = 1024;
const int &refVal = ival;
int &ref2 = ival; //错误
2.指针
指针用于指向对象,保存的是另一个对象的地址。
有两种风格的声明方式,如string *str;或string* str;不能说哪种风格更好,重要的是选择一种并持续使用。
一个有效的指针必须是三种状态之一:保存一个特定对象的地址;指向某个对象后面的对象;0值。因此对指针进行初始化或赋值只能使用如下的值:
0值常量表达式;类型匹配的对象地址;同类型的另一个有效指针;另一对象之后的下一地址;
void* 指针:C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址,如下例
double pi = 3.14;
double *pd = π
void *pv = π
pv = pd;
3.指针和引用的比较
- 引用总是指向某个对象:定义引用时没有初始化是错误的,引用一经初始化,就始终指向同一个特定对象。
- 给引用赋值修改的是该引用所关联的对象的值,而并不是使引用与另一个对象关联,也是引用只被初用于指定同一对象导致的。如下:
int ival = 1024,ival2 = 2048;
int *pi = &ival,*pi2 = &ival2;
pi = pi2; //pi指向了ival2
int &ri = ival,&ri2 = ival2;
ri = ri2; //将ival2赋值给ival
4.指针中关于const的特别注意点
但是注意的是:不能保证const的指针所指对象的值一定不能改变,上例中如果修改了intVal2的值,对应的cpv指针所指的值就会改变,毕竟已经将新的intVal2地址赋给了它。