指针常量,常量指针
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 修改minWage pc = &minWage; double dval = 3.14; // ok: 不能通过pc 修改dval // 虽然dval 本身不是一个常量 pc = &dval; // ok 85 第三章 C++数据类型 dval = 3.14159; // ok *pc = 3.14159; // 错误 const 对象的地址只能赋值给指向const 对象的指针例如pc 但是指向const 对象的 指针可以被赋以一个非const 对象的地址例如 C/C++ code pc = &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 指向的值 下面的代码说明我们可以怎样使用curErr do_something(); if ( *curErr ) { errorHandler(); *curErr = 0; // ok: 重置指针所指的对象 } 试图给const 指针赋值会在编译时刻被标记为错误 C/C++ code curErr = &myErrNumb; // 错误 指向const 对象的const 指针的定义就是将前面两种定义结合起来例如 const double pi = 3.14159; const double *const pi_ptr = π 在这种情况下pi_ptr 指向的对象的值以及它的地址本身都不能被改变。(我们可以从 右往左将定义读作“pi_ptr 是指向被定义为const 的double 类型对象的const 指针”。)