zoukankan      html  css  js  c++  java
  • const关键字与指针

    const关键字与指针

    const修饰指针的4种形式
    (1) const.关键字,在C语言中用来修饰变量,表示这个变量是常量。
    (2) const修饰指针有4种形式,区分清楚这4种即可全部理解const和指针。
    第一种:const  int  *p;
    第二种:int  const  *p;
    第三种:int*  const  p;
    第四种:const  int*  const  p;
    (3)关于指针变量的理解,主要涉及到2个变量:第一个是指针变量p本身,第二个是p指向的那个变量(*p)。一个const关键字只能修饰一个变量,所以弄清楚这4个表达式的关键就是搞清楚const放在某个位置是修饰谁的。
    #include <stdio.h>
    
    
    void main()
    {
        const int *p;             //p本身不是const,而p指向的变量是const
        
        int const *p;             //p本身不是const,而p指向的变量是const
        
        int* const p;             //p本身是const,而p指向的变量不是const
        
        const int* const p;       //p本身是const,而p指向的变量也是const
        
    }

    const修饰的变量真的不能改吗?

    (1)代码练习说明:const修饰的变量其实是可以改的(前提是gcc环境下)。

    #include <stdio.h>
    
    
    void main()
    {
        const int a = 5;
        int* p;
        
        p = (int *)&a;   //这里的报警可以用强制类型转换来消除
    
        *p = 6; 
        printf("a = %d
    ",a); 
    
    }

    (2)在某些单片机环境下,const修饰的变量是不可以改的。const修饰的变量到底能不能真的被修改,取决于具体的环境,C语言本身并没有完全严格一致的要求。

    (3)在gcc中,const是通过编译器在编译的时候执行检查来确保实现的(也就是说const类型的变量不能改是编译错误,不是运行时错误。)所以我们只要想办法骗过编译器,就可以修改const定义的常量,而运行时不会报错。

    (4)更深入一层的原因,是因为gcc把const类型的常量也放在了data段,其实和普通的全局变量放在data段是一样实现的,只是通过编译器认定这个变量是const的,运行时并没有标记const标志,所以只要骗过编译器就可以修改了。

    const究竟应该怎么用

    (1)const是在编译器中实现的,编译时检查,并非不能骗过。所以在c语言中使用const,就好象是一种道德约束而非法律约束,所以大家使用const时更多是传递一种信息,就是告诉编译器、也告诉读程序的人,这个变量是不应该也不必被修改的。

  • 相关阅读:
    【linux]】lighttpd的日志格式
    【vi】awk为指定行的指定字段添加一个单词
    【Android】命令行操作-启动应用程序
    CCS设置第一个li的元素与其他li样式不同
    nginx+tomcat 下POST响应参数过大无法显示完整及文件下载服务遇到过大文件无法下载解决办法
    有重复行,查询时只保留最新一行的sql
    Android定时执行和停止某任务
    MySQL每天自动增加分区
    <html:option获取文本值
    easyui datagrid 增删改查示例
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10279612.html
Copyright © 2011-2022 走看看