引用
引用就是变量的一个别名,对同一个存储单元起了两个不同的名字。
引用在定义时必须进行初始化,而且必须用同类型的对象进行初始化。如下面的例子所示:
int ival = 1024;
int &refVal = ival; // ok
int &refVal2; // error
int &refVal3 = 10; // error
const引用
const引用变量是指定义的变量自以为自己是一个相应const变量的引用。事实上,const引用可以与不同但相关类型的非const变量进行初始化。具体如下:
int i = 42;
const int &r = 42; // OK
const int &r2 = r+i; // OK
double dval = 3.0;
const int &ri = dval; // OK
指针
指针的定义就不罗嗦了,主要关注一下、指针的可能取值、指针的初始化、void*指针、指针的下标操作、const与指针的结合指针的可能取值
共有三种:1 某个特定对象的地址;2 某个对象的后一个对象;3 0值。具体如下:
int ival = 1024;
int *pi3 = 0; //3
int *pi1 = &ival; //1
另外需要注意,虽然指针可以不必在定义的时候初始化,但是一定要避免使用未初始化的指针。
指针的初始化
初始化也有三种类型:1 0值常量表达式;2 类型匹配的对象地址或下一地址;3 同类型的另一个有效指针。具体如下:
int ival = 0;
const int c_ival = 0;
int *pi = c_ival; // OK
pi = 0; // OK
pi = ival; // error
viod*指针
viod*指针的作用:存储任何对象的地址。
void*指针的操作十分有限:1 与另一个指针进行比较;2 作为函数的返回值或者参数类型;3 给另一个void*指针赋值。典型用法如下:
int i = 3;
int *pi = i;
void *pv = &i; //OK
pv = pi; // OK
指针的下标操作
指针的下标操作如同数组,但需注意不要对非法地址进行解引用。
指针与const的结合
指针与const的结合有两种方式:1 指向const对象的指针;2 const指针。定义如下:
int i = 10;
const int *pi;
int const* pic = &i; // 必须在定义时对const指针进行初始化,就像对待const对象以及const引用一样
指向const对象的指针是指该指针自以为指向了const对象,因此可以用同类型的const对象或者非const对象对其进行初始化。但是不能通过该指针来对指向的对象进行修改。但可以更改该指针指向的对象。
const指针则必须在定义时初始化。并且不能重新指向同类型变量,即使是自己也不可以。(详见《C++ Primer》第四版111页)
另外需要注意,如下的代码表示的是const指针而非指向const对象的指针:
typedef int *pint;
const pint cint;
这里,typedef不是简单的文本扩展。const修饰的pint,而pint是指针。