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
    内在的趣味,表面的繁琐
  • 相关阅读:
    JavaScript中的map()函数
    JS中去除字符串空白符
    JS中的reduce函数
    Javascript中中括号的几种形式
    Jquery点击加载更多
    百度编辑器的调用
    Newtonsoft.json 二次引用出错解决办法
    WebConfig配置文件
    jqGrid首次加载时不加载任何数据
    jqGrid列的统计
  • 原文地址:https://www.cnblogs.com/data1213/p/4821162.html
Copyright © 2011-2022 走看看