1、指针常量!它是个常量!
如:int b, c; int * const a = &b; 这里a是一个指针常量,它指向变量b。因为是指针常量,所以不能再修改它的值,再用a指向其他变量,如 a = &c; 错误!但是,可以修改它指向的内容。如:*a = 20; 注意: 常量指针声明的时候,必须赋初值,就像const int n=1;一样。所谓的名词只是一种说法,原理在这里:const int *p = &j;int * const p = &j;用一本经典C/C++语言教程的说法是:有指针,有const的语句采用从右向左的读法:第一句: const int *p = &j;的含义是: p指向整形常量;(* 读作: “指向”)第二句:int * const p = &j;的含义是: p指向常量指针的一个整型值。再复杂的,都可以这么理解。
常量指针,也就是本质是指针,什么样的指针呢?常量类型的指针,什么叫常量类型的指针呢?回忆一下函数指针,指向函数地址的指针。那么常量指针,就是指向常量类型地址的指针。比如const int * p;而指针常量,本质是常量。什么类型的常量?指针类型的常量,为了能够有个术语结构上的对比,你肯定知道整型常量,也知道是这么定义的:const int a;但指针常量,是这么定义的 : int * const a;const 在 *前面,是常量指针,const在*后面,是指针常量。③这二者的区别就是:const int *p 指向的是 const int a=2;的&a;p可以变化但是*p不可以变化。而int * const p=&a; 意思是描述的是p,p不可变,就如const int a=2; a的值就不能再改变了。那么p不可以变,但是*p可以变。还有一种是 综合一起的,const int * const p=&a; 这种一旦确定值,*p和p都不能变化。
const double *cptr;cptr 是一个指向double 类型的const 对象的指针我们可以从右往左把这个定义读为cptr 是一个指向double 类型的被定义成const 的对象的指针此中微妙在于cptr 本身不是常量我们可以重新赋值cptr 使其指向不同的对象但不能修改cptr 指向的对象例如const double *pc = 0;const double minWage = 9.60;// ok: 不能通过pc 修改minWagepc = &minWage;double dval = 3.14;// ok: 不能通过pc 修改dval// 虽然dval 本身不是一个常量pc = &dval; // ok85 第三章 C++数据类型dval = 3.14159; // ok*pc = 3.14159; // 错误const 对象的地址只能赋值给指向const 对象的指针例如pc 但是指向const 对象的指针可以被赋以一个非const 对象的地址例如C/C++ codepc = &dval;虽然dval 不是常量但试图通过pc 修改它的值仍会导致编译错误因为在运行程序的任意一点上编译器不能确定指针所指的实际对象在实际的程序中指向const 的指针常被用作函数的形式参数它作为一个约定来保证被传递给函数的实际对象在函数中不会被修改例如C/C++ code// 在实际的程序中, 指向常量的指针// 往往被用作函数参数int strcmp( const char *str1, const char *str2 );在第7 章关于函数的讨论中我们会更多地讨论指向const 对象的指针我们可以定义一个const 指针指向一个const 或一个非const 对象例如int errNumb = 0;int *const curErr = &errNumb;curErr 是指向一个非const 对象的const 指针我们可以从右拄左把定义读作“curErr是一个指向int 类型对象的const 指针”。这意味着不能赋给curErr 其他的地址值但可以修改curErr 指向的值下面的代码说明我们可以怎样使用curErrdo_something();if ( *curErr ) {errorHandler();*curErr = 0; // ok: 重置指针所指的对象}试图给const 指针赋值会在编译时刻被标记为错误C/C++ codecurErr = &myErrNumb; // 错误指向const 对象的const 指针的定义就是将前面两种定义结合起来例如const double pi = 3.14159;const double *const pi_ptr = π在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变。(我们可以从右往左将定义读作“pi_ptr 是指向被定义为const 的double 类型对象的const 指针”。)