C++中常量指针,指针常量(const 和*)的使用方法和理解方法

当const和指针一起使用的时候,会出现很多复杂的情况,这些复杂的情况大概可以归纳为3种情况:

        (1),指向常量的指针。

        (2),常指针。

        (3),指向常量的常指针。

现在,我来为大家分析这三种使用情况以及用法。


      (1),指向常量的指针是是说一个指向常量的指针变量,例如:

               const char* name = "chen";      //声明指向常量的指针。

         这个语句的含义为:声明一个名字为name的指针变量,它指向一个常量(这个常量为字符型),初始化name为指向字符串“chen”。

         由于使用的const,不允许改变该指针所指向的地址中的常量,因此以下语句是错误的:

              name[3] = 'a';          //报错,指针所指向的地址中的值是常量值,不能改变。

          但是,由于name是一个指向常量的一般指针变量,不是常指针,因此可以改变name所指向的地址。以下操作是正确的:

               name = "abcd";                //合法,可以改变指针所指向的地址。

         该语句付给了name另外一个字符串的首地址,改变了name的值。


        (2),常指针是把指针所指的地址(而不是它所指向的对象)声明为常量,例如:

                char* const name = "chen";             //常指针

         这个语句的含义是:声明一个名字为name的指针变量,该指针是指向字符型数据的常指针,用"chen"的地址初始化该常指针。

        创建一个常指针,就是创建一个不能移动的固定指针,即不能改变它所指向的地址,但是可以改变所指向的地址中的数据。例如:

                name[2] = 'a';           //合法,改变所指向的地址中的值

                name = “abcd”;    //编译不通过,name所指向的地址是不能够被改变的。

        第一个语句是要改变指针所指的地址中的数据,这是合法的,而第二个语句则是要改变该常指针的地址,显然是不合法的。


           (3),指向常量的常指针,是指这个指针本身不能被改变,它所指向的地址中的数据也是不能被改变的。要声明这个指向常量的常指针,二者在声明的时候都要用const,例如:

                  const char* const name = "chen";       //指向常量的常指针。

           这个语句的含义是:声明一个名字为name的指针变量,它是一个指向字符型常量的常指针,用”chen“的地址初始化该指针。因此,对于以下两个表达式都是错误的:

                  name[2] = 'a';            //出错,指针所指向的地址中存的是常量,不能更改

                  name = "zhang";     //出错,该指针所指向的地址不能被更改。



        补充说明:

                     (1),如果用const定义的是一个整型常量,关键字int可以被省略。所以以下的两行定义是完全等价的:

                   const int MAXSIZE = 10;

                   const MAXSIZE = 10;           //省略了关键字int

                      (2),常量一旦被建立,在程序的任何地方都不能更改。

                      (3),与#define定义的常量有所不同,const定义的常量可以有自己的数据类型,这样C++可以进行更加严格的类型检查,具有良好的编译时的检测性。

                       (4),函数的形参也可以用const说明,用于保护形式参数在该函数内部不会被改变,大多数C++编译器能对具有const参数的函数进行更好的代码优化。例如,希望通过函数i_MAX求出整形数组a[200]中的最大值,函数原型是:

                        int i_MAX(const int* ptr);

                       调用时的格式可以是:

                      i_MAX(a);

                       这样做的目的是为了确保原数组中的值不会被破坏,即在函数中,只允许对该数组进行读,不允许进行写。

-------------------------------------------------------------------------------------------                                       以上内容由阮坤原创,若需要转载,请注明出处。


转载于:https://my.oschina.net/qkmc/blog/654856

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值