指针常量,常量指针

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 指针”。)

 

posted @ 2014-01-01 16:37  yuanqi  阅读(350)  评论(0编辑  收藏  举报