zoukankan      html  css  js  c++  java
  • C语言 const 修饰指针

    目录

    零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门

    一.const 简介

    const 是 constant 的缩写,意思是“恒定不变的”!它是定义只读变量或者常变量的关键字。const 定义的是变量,但又相当于常量;说它定义的是常量,但又有变量的属性,所以也叫常变量。

    const 定义的变量的值是不允许改变的,即不允许给它重新赋值,即使是赋相同的值也不可以。所以说它定义的是只读变量。这也就意味着必须在定义的时候就给它赋初值。

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 const 修饰指针
    //@Time:2021/07/02 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    #include <stdio.h>
    
    int main() {
        const int a = 20 ;
        printf("a = %d
    ",a);
        a = 200 ;
        printf("a = %d
    ",a);
        return 0;
    }
    
    /*
     输出:
    
     Compilation Failed
     error: assignment of read-only variable 'a'
         6 |     a = 200 ;
           |     ~~^~~~~
     */
    

    二.const 修饰指针

    首先应该回忆一下指针内容:

    int *p = 5;
    
    /*
    
    p:指针的内存地址,类似门牌号,十六进制表示:0xffff
    
    *p:指针的内存地址对应的值,类似门牌号对应里面住的人,即5
    
     */
    

    1.const int *p

    当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 const 修饰指针
    //@Time:2021/07/02 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    # include <stdio.h>
    
    int main(void)
    {
        int a = 10;
        const int *p = &a;
        int * q = &a;
        *q = 20;
        printf("a = %d
    ", a);
        a = 30;
        printf("a = %d
    ", a);
    
        //const int *p = &a; //表示 *p 值不能发生改变否则 error: assignment of read-only location '* p'
        //*p = 30;  //这么写就是错的
    
    
        return 0;
    }
    
    /*
     输出:
    
    a = 20
    a = 30
    
    */
    

    2.int const *p

    constint 可以互换位置,所以 int const *p 和 const int *p 二者是等价的;

    3.int * const p

    此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 const 修饰指针
    //@Time:2021/07/02 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    # include <stdio.h>
    
    int main(void)
    {
        const char *p = "hello"; //*p 不可以改变 ,p地址可以改变
        char* const q = "bbb"; // q地址不能改变
    
        p++;   //ok
        //q++; //这句是错误的. error: increment of read-only variable 'q'
    
        printf("%s
    ",p);
        printf("%s
    ",q);
        return 0;
    }
    
    /*
     输出:
    
     ello
     bbb
    
    */
    

    灵魂拷问:知道为什么输出是 “ello” 而不是 “hello” ??

    4.const int * const p

    *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。

    /******************************************************************************************/
    //@Author:猿说编程
    //@Blog(个人博客地址): www.codersrc.com
    //@File:C语言教程 - C语言 const 修饰指针
    //@Time:2021/07/02 08:00
    //@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
    /******************************************************************************************/
    
    # include <stdio.h>
    
    int main(void)
    {
        const char * const p = "hello"; //*p 不可以改变 ,p地址不可以改变
    
        //*p++;   //这句是错误的. error: increment of read-only variable 'p'
        //p++;    //这句是错误的. error: increment of read-only variable 'p'
    
        printf("%s
    ",p);
    
        return 0;
    }
    

    综上所述,使用 const 修饰指针可以保护用指针访问内存时由指针导致的被访问内存空间中数据的误更改。因为指针是直接访问内存的,没有拷贝,而有些时候使用指针访问内存时并不是要改变里面的值,而只是要使用里面的值,所以一旦不小心误操作把里面的数据改了就糟糕了。

    三.猜你喜欢

    1. C 语言 数组下标越界和内存溢出区别
    2. C 语言 指针声明和定义
    3. C 语言 指针 p++ / p–
    4. C 语言 p++/§++/_(p++)/_p++
    5. C 语言 使用指针遍历数组
    6. C 语言 指针和数组区别
    7. C 语言 指针数组和数组指针区别
    8. C 语言 空指针 NULL
    9. C 语言 void 指针
    10. C 语言 野指针
    11. C 语言 函数值传递和址传递
    12. C 语言 函数缺省参数
    13. C 语言 函数不定长参数
    14. C 语言 函数指针
    15. C 语言 指针函数
    16. C 语言 回调函数 callback
    17. C 语言 typedef
    18. C 语言 define 定义常量
    19. C 语言 define 防止头文件重复包含
    20. C 语言 #pragma once
    21. C 语言 #include <> 与 #include “” 区别
    22. C 语言 const 修饰变量
    23. C 语言 const 修饰指针

    未经允许不得转载:猿说编程 » C 语言 const 修饰指针

    本文由博客 - 猿说编程 猿说编程 发布!

  • 相关阅读:
    使用twisted.web实现代理服务器
    django signal 浅析
    python 中接口的实现
    浅析django的abstract,proxy, managed
    python-twisted系列(1)
    postgresql 函数demo
    django 1.5+ 权限设计浅析
    django 1.7 新特性 --- data migration
    BZOJ 3670 [Noi2014]动物园 (KMP)
    BZOJ 1029 [JSOI2007]建筑抢修 (贪心 + 优先队列)
  • 原文地址:https://www.cnblogs.com/shuopython/p/15239419.html
Copyright © 2011-2022 走看看