先初步了解引用、指针的一些注意事项。

  • 引用并非对象
  • 引用必须初始化
  • 引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
  • 类型要严格匹配
int &a = 10;             //错误:引用类型的初始值必须是一个对象  
  
double a = 3.14;  
int &b = a;              //错误:此处引用类型的初始值必须是int型对象

指针本身就是对象

指针的类型要和它指向的对象严格匹配

double dval;  
double *pd = &dval;      //正确  
double *pd2 = pd;        //正确  
  
int *pi = pd;            //错误:指针pi的类型和pd的类型不匹配  
pi = &dval;              //错误:试图把double型对象的地址赋给int型指针  

有例外:引入const 限定符

常量引用

初始化常量引用时允许用任意表达式作为初始值

int i = 42;  
const int &r1 = i;       //正确:允许将const int & 绑定到一个普通int对象上  
const int &r2 = 42;      //正确  
const int &r3 = r1 * 2;  //正确  
int &r4 = r1 * 2;        //错误  
  
double dval = 3.14;  
const int &ri = dval;    //正确  
//等价于  
const int temp = dval;  
const int &ri = temp;  
  
int i = 42;  
int &r1 = i;  
const int &r2 = i;  
r1 = 0;                  //正确  
r2 = 0;                  //错误  

指向常量的指针

int i = 42;  
int &r1 = i;  
const int &r2 = i;  
r1 = 0;                  //正确  
r2 = 0;                  //错误  
  
  
const double p = 3.14;  
double*ptr = &p;         //错误  
const double*cptr = &p;  //正确  
*cptr = 42;              //错误  
  
double dval = 3.14;        
const double*cptr = &dval;//正确  

和常量引用一样,指向常量的指针也没有规定其所指的对象必须是一个常量。所谓指向常量的指针仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变。

Tip: 所谓指向常量的指针或引用(即常量引用、指向常量的指针),不过是指针或引用"自以为是"罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值,但这些对象却可以通过其他途径改变。

常量指针

必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。常量指针并不意味着不能通过指针修改其所指对象的值。

int errNumb = 0;  
int *const curErr = &errNumb;      //curErr将一直指向errNumb  
const double p = 3.14159;  
const double*const pip = &p;       //由于是常量p,因而pip是一个指向常量对象的常量指针,将一直指向p  
*pip = 2.72;                       //错误:pip是一个指向常量的指针  
if (*curErr)  
{  
    errorHandler();  
    *curErr = 0;               //正确:把curErr所指的对象的值重置  
}  

原文地址:http://blog.csdn.net/Rueing839/article/details/48416907