关于const的一些理解

1. 限定符声明变量只能被读
   const int i=5;
   int j=0;
   ...
   i=j;   //非法,导致编译错误
   j=i;   //合法


2. 必须初始化
   const int i=5;    //合法
   const int j;      //非法,导致编译错误


3. 在另一连接文件中引用const常量
   extern const int i;     //合法
   extern const int j=10;  //非法,常量不可以被再次赋值

 

4. const的难点在于与指针结合使用的时候,如下

   char a[10];

   const char *p = a;    [1]          //a是一个数组的首地址.p是指向常量的指针

   char const *p = a;    [2]
   char* const p = a;    [3]         //a是一个数组的首地址.p是指针常量;

 

参考《Effective c++》Item21上的做法,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的 右侧,const就是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容为常量(const放在变量声明符的位置无 关),下面详细分析一下。

 

   ——const char*p = a;       //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组中的数据,意思即是说p本身是可以变化的,

                                                //p可以指向不同的地址,但是p指向的地址中存储的值是不能通过p来改变的,对p而言,必须是常量。

                                                //例如,下列例子试图通过指针p来给数组a中的元素赋值就是不允许的:
                                                // *p = 10;         /*错误*/
                                                // *(p + 2) = 1;  /*错误*/

   ——char * const p = a;     //这时候p是指针常量,我们知道,指针是指向了一个数组的首地址,那么,它的位置就不可以改变了。

                                                //现在和第一个表达式比较,现在的数组并不是常量数组,所以数组的数据是可以改变的,但是指针这时

                                                //候是不可以移动的,指针p指向数组的第一个数据所存储的位置,也只能指向这个位置。

                                                //这一点请别误解,指针常量是指这个指针变量p的值(即p代表的地址)本身不可以改变(即p只能指向这个
                                                //地址) ,并不是它指向的内容(p所指向的地址中存储的值)不可以改变,这一点切记!

                                                
                                                  //下面举几个例子帮助理解,可以通过p来给数组元素赋值,但是p是不能移动的:
                                                  //  *p = 2;          /*可以*/
                                                 //  *(p+1) = 10;     /*可以*/
                                                 //  p++;             /*不可以*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值