zoukankan      html  css  js  c++  java
  • c++中const与指针总结

    一、const与指针一起使用

    const与指针同时使用主要分为两种情况:(1)指针指向的内存地址里装的内容是不能被修改的。(2)指针只能指向一个初始地址,不能再指向其他地址。

    (1)指针指向的是const类型的,它的意思是指针指向的内存里的内容是不能通过指针被修改的。它有两种写法。

    const int* p; (推荐)

    int const* p;

    这两种写法的意思是一样的,前一种比较推荐。它的意思是指针p所指向的内容是const int类型的。即p所指向的内容是不能改变的。严格来说,应当是p所指向的内存所装的内容,是不能通过指针p来改变的。下面举个例子,

    1 const int* p1;
    2 int const* p2;//
    3 int a=1,b=2;
    4 p1=&a;//正确
    5 p2=&b;//正确
    6 cout<<*p1<<*p2<<endl;//此时*p1=1,*p2=2;
    7 *p1=3;//编译错误,*p1的值不可以被改变
    8 a=6;
    9 cout<<*p1<<endl;//此时,*p1=6,可见p1所指向的内存里装的值仍然可以被改变的,只是不能通过指针p1来改变而已。

    通过上述例子可以看出,其实p1所指向的那块内存的值是可以改变的,只不过不允许通过指针p1来改变而已。

    (2)const指针,它只有一种写法:

    int* const p=&a; (因为指针本身的值是不能被修改的所以它必须被初始化)

    这种形式可以被理解为:p是一个const的指针(不能再指向其他地址了),这个指针是指向int 类型的。它指向的值是可以被改变的如*p=3(这时,a的值也被赋为了3);但指针本身是不能改变的,即p=&b是不允许的。

    (3)指针本身和它指向的内容都是不能被改变的。比如:

    const int* const p=&a;

    int const* const p=&a;

    上面两种写法是一样的,(3)(1)(2)的一个综合写法。

    区分以上三点有个规律:指向const的指针(指针指向的内容不能被修改)const关健字总是出现在*的左边,而const指针(指针本身不能被修改)const关健字总是出现在*的右边,那不用说两个const中间加个*肯定是指针本身和它指向的内容都是不能被改变的。

    最后,给出一段总的代码,来验证以上3个方面

    #include <iostream>
     using namespace std;
    
     int main(int argc, char *argv[])
     {
         int a=3;
         int b;
    
         /*定义指向const的指针(指针指向的内容不能通过指针被修改)*/
         const int* p1;
         int const* p2;
    
         /*定义const指针(由于指针本身的值不能改变所以必须得初始化)*/
         int* const p3=&a;
    
         /*指针本身和它指向的内容都是不能被改变的所以也得初始化*/
         const int* const p4=&a;
         int const* const p5=&b;
        //(1)------------------------------------------------------------
          p1=p2=&a; //正确
          *p1=*p2=8; //错误,编译不通过(指针指向的内容不能被修改)
          a=4;
          cout<<*p1<<endl;//*p1=4,不通过指针p1,用其他方式是可以修改这块内存的。
        //(2)------------------------------------------------------------
          p3=p1; //错误,编译不通过(指针所指向的内存地址不能被更改)
          *p3=5; //正确,指针所指向的内存里装的值是可以变的
          cout<<*p3<<a<<endl;//输出*p3和a的值都是5,变量a的值也跟着指针被修改了。
        //(3)------------------------------------------------------------
          p4=p5;//错误,编译不通过 (指针本身和它指向的内容都是不能被改变)
          *p4=*p5=4; //错误,编译不通过(指针本身和它指向的内容都是不能被改变)
    
         return 0;
     }

    参考博客:http://www.cnblogs.com/younes/archive/2009/12/02/1615348.htm,感谢相关博主。

  • 相关阅读:
    周记(2015-11-30 -- 2015-12-05)
    周记(2015-11-22 -- 2015-11-27)
    周记(2015-11-15 -- 2015-11-20)
    周记(2015-11-01 -- 2015-11-06)
    设备与主机的攻击日志类型分析总结
    OWASP十大攻击类型详解
    乌云TOP 10 简单介绍
    《启示录》读书笔记三
    百度地图和定位
    获取Android studio的SHA1值
  • 原文地址:https://www.cnblogs.com/james6176/p/2740394.html
Copyright © 2011-2022 走看看