当我们声明一个常量:const double minWage = 9.60;我们是否可以这样 double *ptr = &minWage;答案显然是不可能的,因为prt是一个普通指针,没有什么能够阻止我们写这样的代码:*prt += 1.40;//修改了minWage! 这样就间接的修改了minWage的值。
我们必须声明一个指向常量的指针来做这件事:const double *cptr; //cptr是一个指向double 类型的const指针,即:cptr是一个指向double类型的、被定义成const的对象指针。
但其中的微妙在于cptr本身不是常量,我们可以重新赋值cptr,使其指向不同的对象,但不能修改cptr指向的值 。
例如:const double *pc = 0;
const double minWage = 9.60;
pc = &minWage; //ok
*pc = 3.14; //error
const对象的地址只能赋值给指向const 对象的指针,例如pc。但是指向const对象的指针可以被赋以一个非const对象的地址,例如:int dval = 10; cont int *pc = &dval;虽然dval不是常量,但试图通过pc修改它的值,仍会导致编译错误。
在实际的程序中,指向const的指针常被用作函数的形式参数。这样能保证被传递给函数的实际对象在函数中不会被修改。例如:int strcmp(const char *str1,const char *str2);
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
引用类型:
引用类型在声明的时候必须初始化,例如 int a = 10; int &b = a ;//ok int &c ; //error
引用一旦被初始化就不能再指向其他的对象了。
const引用可以用不同类型的对象初始化(只要能从一种类型转换到另一种类型即可),也可以是文字常量。例如:
double dval = 3.14;
//仅对于const引用才是合法的
const int &ir = 1024;
const int &ir = dval;
const double &dr = dval + 1.0;
同样的初始化对于非const引用是不合法的,将导致编译错误。引用在内部存放的是一个对象的地址,它是该对象的别名。对于文字常量,以及不同类型的对象,编译器为实现引用,必须生成一个临时对象,引用实际上指向该对象,但用户不能访问。例如,我们编写这样的语句:double dval = 1024;
const int &ri = dval;
编译器将其转换成:int temp = dval;
const int &ri = temp;
如果我们给ri赋一个新值,则这样做不会改变dval,而是改变temp。但对用户来说,就好像修改动作没有生效。