zoukankan      html  css  js  c++  java
  • const关键字对指针的影响

    const关键字定义的变量

    #include<stdio.h>
    int  main( void )
    {
        const int a = 10;
    
        a = 20;
    }
    

    结果怎样?

    编译错误

    [Error] assignment of read-only variable ‘a’ 变量a是只读的。

    得到一个结论,使用const修饰的变量是常量,我们无法修改。在gcc中把const常量放到了data段,和全局变量一样,只是把它放到了一个区域中让我们无法修改,在运行过程中并没有标记const。

    了解内容:

    三种内存来源: 栈(stack) 堆(heap) 数据区(data)(也就是数据段)
    (1)在操作系统专用获取内存的三种方式(C语言程序中): 栈(stack) 堆(heap) 数据区(data)(也就是数据段)

    难道const定义的变量真的不能被修改吗?

    #include<stdio.h>
    int  main( void )
    {
        const int a = 10;
        int * p = &a;
        *p = 20;
        printf(" a = %d
     ",a);
    }
    //编译信息:
    [Warning] initialization discards 'const' qualifier from pointer target type [enabled by default]
    

      

    变量a居然被修改了。。。好神奇。再来深入理解const含义,const定义的变量真的是不能被修改吗?不是的。有时候我们在传输数据的时候,只希望从我家血池传送到地方水晶去,在中途不被干扰,就让const来保驾护航,保护变量a的安全。但是若有一个更强大的英雄(指针)来刺杀变量a,也是有可能的,不仅无视const守卫,还干掉了变量a。

    使用const关键字主要是告诉程序员和编译器,这个变量不必要修改,我们的目的是使用它,不是改变它(若要恶意修改也是可以做到的)

    注意:
    第一次直接给const常量赋值的编译信息是error,第二次通过指针给const常量赋值的编译信息是warning,这也证明了,const常量可以修改,但是一定要注意自己在干什么,也就是说程序员一定要知道自己已经修改了const常量。

    const和指针结合

    const 修饰指针有4中形式,区分这四种即可理解const和指针。
    第一种:const int*p // 指针所指向的变量是常量
    第二种:int const *p //指针所指向的变量是常量
    第三种:int* const p // 指针p本身是常量
    第四种:const int * const p //指针p本身和他所指向的变量都是常量

    有点乱哈,记住这句话就好多了

    注意区分指针变量本身指针所指向的变量。一个const只能修饰一个变量。

    >第一种:const int * p              //  指针所指向的变量是常量
        int a = 10;
        int b = 20;
        const int * p =&a; 
        //*p = 30;  //const修饰的是指针所指向的变量,所以这行出错
        p = &b;     //指针变量本身是可以修改的
    
    >第二种:int  const  *p         //指针所指向的变量是常量
        int a = 10;
        int b = 20;
        const int * p =&a; 
        //*p = 30;  //const修饰的是指针所指向的变量,所以这行出错
        p = &b;     //指针变量本身是可以修改的
    

      

    上面两种情况都是指针指向的变量是常量不可修改,下面来看指针本身是不可修改的。 >第三种:int* const p // 指针p本身是常量 int a = 10; int b = 20; int * const p = &a; //指针指向a *p = 30; //指针指向的变量是可以修改的 //p = &b; //指针p本身是不可修改的 >第四种:const int * const p //指针p本身和他所指向的变量都是常量 int a = 10; int b = 20; const int *const p = &a; //指针本身和指针指向的变量都是不可修改的 //*p = 30; 出错 //p = &b; 出错

    怎么区分谁是不可修改的?
    分析:

    //  第一种:const int*p             
    //  第二种:int  const *p   
    //  第三种:int* const p            
    //  第四种:const int * const p 

    第一种情况:const int*p

    const 后面是int*p; int*p是一个整体,是指针指向的变量,所以const 修饰指针指向的变量
    第二种:int const *p
    const 后面是 *p; *p是指针指向的变量,所以const修饰指针指向的变量

    第三种:int* const p

    const 后面是 p,p是指针,所以const修饰的是指针本身,而不是它所指向的变量

    第四种:const int * const p
    先看第二个const得知修饰的是指针,再来看第一个const,和第一种一样了,修饰的指针指向的变量。

    学会一步一步的分析,从关键字出发,一步一步来。
    const 修饰的变量可以通过指针来修改

    const int a = 10;
    int * p = &a;
    *p = 20;
    printf(" a = %d
    ",a);
    const修饰的指针如何修改?
    int a = 1;
    int b = 2;
    int * const p = &a;
    //p = &b;   //直接修改肯定会出错,那怎么办?
    //修改const变量是通过指针,那再通过指针修改指针行不行呢?
    
    int a = 1;
    int b = 2;
    int **test;
    int * const p = &a;
    test = &p;
    *test = &b;
    printf("*p = %d
    ",*p);     ////*p = 0000000000000002
                                //指针从原来的指向a,变成了现在指向的b
    

      

    总结:
     搞清const 与指针的用法,能够区分const对指针的影响。

  • 相关阅读:
    队列课下作业
    20162305 2017-2018-1 《程序设计与数据结构》第6周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第5周学习总结
    线性结构 实验报告 20162305
    算法复杂度-实验博客
    2017-2018-1 《程序设计与数据结构》第3周学习总结
    20162305 2017-2018-1 《程序设计与数据结构》第2周学习总结
    20162316刘诚昊 课下排序测试
    20162316刘诚昊 17年10月9日测验“排序课堂测试”
    20162316刘诚昊 第五周学习总结
  • 原文地址:https://www.cnblogs.com/1024E/p/13209626.html
Copyright © 2011-2022 走看看