const与指针

  const和指针之间有两种修饰关系,一种是const用来修饰指针本身----const指针,另一种是const修饰指针指向的对象----指向const对象的指针
 
  1、const指针
  首先介绍const指针,即上述第一种情况,const用来修饰指针本身,只是限定该指针的内容不可以被修改,而指针所指向的对象则不加以限制。
  只有一种用法:
    int a;
    int * const p = &a;    (可理解为:p为一个指向int型的指针,该指针为const)
              //因为指针的值不可以被修改,所以必须被初始化
 
  2、指向const对象的指针
  const用来修饰指针所指向的对象,通过该指针访问其所指对象时,对象具有const性质,即不可以通过该指针修改对象的值。不能使用指向const对象的指针修改基础对象,然而如果该指针指向的是一个非const对象,可用其他方法修改其所指的对象。
  有两种用法:
    int b = 4;
    const int *p = &b;    (可以理解为:p为一个指针,指向的对象是const int型,推荐)
    int const *q = &b;    (不易理解,易混淆,不推荐使用)
    b = 5;
    *p = 6;
    *q = 7;
 
  通过比对,发现const指定义时,const在*的右边,const修饰的是指针(p),故p的值不可以被修改;而指向const对象的指针,定义时const关键字在*的左边,说明const修饰的是(*p),即指针指向的对象不能被修改。
 
  3、指向const对象的const指针
    const int * const p = &a;
 
   4、指针与typedef
  实例:
    typedef int * pint;
    const pint pi;
  请问,pi是什么类型,简单的回答是const pint类型的指针。进一步问:const pint指针所表示的真实类型是什么?很多人都认为真正的类型是:
    const pint * pi;
  也就是说,const pint 是一种指针,指向int类型的const对象,但这是错误的。
  解释: 声明const pint时,const修饰的是pint的类型,这是一个指针。因此,该声明语句应该是把pi定义为指向int类型对象的const指针。这个定义等价于:
    int * const pi;   
 
#include <iostream>

using namespace std;

int main()
{
    int a = 4;
    int b;

    //定义const指针,指针本身值不能修改,必须初始化
    int * const p1 = &a;
    *p1 = 5;    //ok
    p1 = &b;    //error

    //定义指向const对象的指针
    const int *p2;
    int const *p3;

    p2 = &a;    //ok
    p3 = &b;    //ok

    a = 3;  //ok
    *p2 = 3;    //error
    p2 = p3;    //ok

    //定义执行const对象的const指针,指针本身的值和指针指向的对象的值都不可以被修改
    const int * const p4 = &a;
    int const * const p5 = &b;

    *p4 = 4;    //error
    p4 = &b;    //error

    typedef int *pint;
    const pint pi = &a;
    a = 9;
    *pi = 9;
    pi = &b;  //error

    return 0;
}

  

 
                                
    本文主要是自己在学习C++时的一些总结,希望对您的学习有些帮助。学习的主要参考资料:

  http://www.cnblogs.com/younes/archive/2009/12/02/1615348.html

  http://www.cnblogs.com/hustcat/archive/2009/04/11/1433549.html

  C++ Primer。

posted @ 2013-04-14 01:26  天心程序圆  阅读(267)  评论(0编辑  收藏  举报