Twenty-five years without you

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

C++中的指针的使用是非常灵活的,const关键字的作用与其字面意思相同“常量,不变的量”,二者结合起来的用法有两种:

第一种方法是让指针指向一个常量对象——可以修改指针的指向(即指针本身的值),不可以通过指针修改所指对象的值;

第二种方法是将指针本身声明为常量——不可以改变指针的指向

 

先了解一下第一种方法

int a = 1;
const int* pa = &a;

上面代码中pa是一个指向常量的指针,虽然a没有声明为const常量,但是不可以通过pa来修改a的值,也就是说*pa的值是const,不能被修改。
进一步看这段代码:我们发现可以将一个非const常量地址赋给一个指向该类型的常量的指针,也就是说“指向常量的指针——既可以指向常量,也可以指向非常量”

上面的代码中,可以直接修改a的值,但不可以通过指针pa来修改a的值:

int a = 1;
const int* pa = &a;

a = 2;  //OK
*pa = 2;  //INVALID


 

第二种方法相对好理解:

int b = 1;
int* const cpb = &b;

很明显const关键字的位置和第一种情况不同,const的位置更接近于指针的名字:cbp,此时不能修改cpb的值让它指向另外一个int变量,但是可以通过指针来修改b的值。

 

最后总结一下const变量、非const变量、const指针和非const指针之间的关系:

非const变量的地址 可以  赋给指向const的指针;

   const变量的地址 可以 赋给指向const的指针;

非const变量的地址 可以  赋给常规指针;

   const变量的地址 不可以 赋给常规指针;

记忆方法是常规变量地址可以赋给常规或非常规的指针,const变量地址只能给指向const指针,不能给常规指针。

在实际编程中的做法是尽可能的使用const,这样既可以防止无意中修改数据,又可以接受const和非const的对象地址。

 

在进一步深入,上面的讨论只涉及到一级间接关系——指针只是指向基本的数据类型,如果将一个指针的地址赋给另一个指针时的情况会怎样呢?

 

1 const int a = 1;
2 int* pa;
3 const int **ppa;
4 
5 ppa = &pa;  //INVALID
6 *ppa = &a;  //OK

 

第四行代码试图将一个非const的int**转换成const的int**,会导致编译错误,因此在二级间接关系中,不能将常规地址赋给const指针。

 

posted on 2012-10-07 22:29  Rumble Zheng  阅读(239)  评论(0编辑  收藏  举报