zoukankan      html  css  js  c++  java
  • const和volatile分析

    c语言中const修饰的变量是只读的,不能直接作为赋值号的左值,其本质还是变量;会占用内存空间;本质上const在编译器有用,运行时无用(还是可以通过指针改变它的值)

    1 const int abc=1;
    2 
    3 int *p=&abc;
    4 
    5 *p=3;
    6 
    7 printf("%d
    ",abc); //3
     1 const int* p; //p可改变,p指向的内容不可改变
     2 
     3 int const* p; //p可变,p指向的内容不可改变
     4 
     5 int* const p; //p不可变,p指向的内容可变
     6 
     7 const int* const p; //p和p指向的内容都不可变
     8 
     9 //当const出现在*左边的时候,指针指向的内容不可改变
    10 
    11 //当const出现在*右边的时候,指针本身的内容不可改变    
    12 
    13 内容不可变,不是绝对的,任然可以通过指针改变其内容  左数右指:在左边,数据内容不可变;在右边,指针内容不可变

    const修饰的函数参数表示在函数体内不希望被改变;const修饰的函数返回值表示返回值不可改变,多用于返回指针的情形。

     1 const int* func()
     2 
     3 {
     4 
     5   static int count = 0;
     6 
     7   count++;
     8 
     9   return &count;
    10 
    11 }
    12 
    13 int main()
    14 
    15 {
    16 
    17   int i = 0;
    18 
    19   const int* p=func();
    20 
    21   printf("%d
    ",*p);
    22 
    23   return 0;
    24 
    25 }
     1 const int* func()
     2 
     3 {
     4 
     5   static int count = 0;
     6 
     7   count++;
     8 
     9   return &count;
    10 
    11 }
    12 
    13 int main()
    14 
    15 {
    16 
    17   int i = 0;
    18 
    19   int* p=func();  // 会报出错
    20 
    21   printf("%d
    ",*p);
    22 
    23   return 0;
    24 
    25 }

    volatile:用于告诉编译器每次去内存中取变量的值,不去做优化;主要修饰可能被多个线程访问的变量;也可以修饰被未知因素被改变的变量:
    编译器的优化:如果发现某个变量从未出现过在赋值左边的情况,那么这个变量就直接替换成其值,但是如果被其他因素修改,所以就会出错。

    1 volatile int i=0
    内在的趣味,表面的繁琐
  • 相关阅读:
    从程序员到项目经理
    wumii 爆款总结经验
    快速的搭建JFinal的ORM框架示例
    Hibernate all-delete-orphan[转]
    HHvm Apache 2.4 Nginx建站环境搭建方法安装运行WordPress博客
    雷军是如何从程序员蜕变成职业经理人的
    Postgresql数据库数据简单的导入导出
    如何一年看50本好书?
    清除DNS解析缓存
    mysql 下 计算 两点 经纬度 之间的距离
  • 原文地址:https://www.cnblogs.com/data1213/p/4821162.html
Copyright © 2011-2022 走看看