• <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 發布時間:2020-09-29 08:58 原文鏈接: C語言之const和volatile究極學習(二)

    輸出結果:

    root@txp-virtual-machine:/home/txp# ./a.out
    Segmentation fault (core dumped)

    注解:這里會有段錯誤,錯誤出現在const+static修飾的j變量對其進行修改,還有const修飾的全局數組。

    5、const修飾函數參數和返回值

    const修飾函數參數表示在函數體內不希望改變參數的值

    const修飾函數返回值表示返回值不可改變,多用于返回指針的情形

    在c語言中的字符串字面量存儲于只讀存儲區中,在程序中需要使用const char* 指針,例如:

    const char * s = "TXP嵌入式";//字符串字面量

    代碼示例:

    #include <stdio.h>
    const char*fun(const int i)

      i=8;
       return "TXP";

    int main()

      const char * p=fun(0);
       printf("%s",p);
       p[1]='_';
       printf("%s",p);
       return 0;

    輸出結果:

    root@txp-virtual-machine:/home/txp# gcc test.c
    test.c: In function ‘fun’:
    test.c:5:4: error: assignment of read-only parameter ‘i’
       i=8;
       ^
    test.c: In function ‘main’:
    test.c:12:5: error: assignment of read-only location ‘*(p + 1u)’
        p[1]='_';
        ^

    注解:上面這樣寫,肯定有問題。

    代碼進化:

    #include <stdio.h>
    const char*fun(const int i)

    //   i=8;
       return "TXP";

    int main()

      const char * p=fun(0);
       printf("%s",p);
     //  p[1]='_';
      // printf("%s",p);
       return 0;

    輸出結果:

    root@txp-virtual-machine:/home/txp# ./a.out
    TXP

    二、volatile的用法

    老實說,這個關鍵字在面試題目里面經常會出現,但是平時學習的時候,如果你沒有真正理解這其中的含義,在筆試的時候,腦袋里面可能依稀是記得有那么幾個結論,但是有時候吧,一緊張就把結論給忘了,也不是不可能,所以說,咋們還是老實一點,得真正把它原理搞明白才行,這樣上來戰場就不怕了,以后寫代碼也就少一點bug。

    1、volatile的常用結論(volatile英文本意就是易變的意思)

    這里我先給結論,然后再給一個例子,把這個例子的講明白,所有結論就都明白了。

    volatile可理解為“編譯器警告指示字”

    volatile告訴編譯器必須每次去內存中取變量值

    volatile主要修飾可能被多個線程訪問的變量

    volatile也可以修飾可能被未知因素更改的變量

    volatile可以修飾一個中斷子程序中會訪問到的非自動變量

    2、分析原理

    大家可能平時在博客學習,都會發現講解編譯器優化的,然后加了volatile關鍵來修飾變量,就告訴編譯器不要去優化這個變量了,那么這里的優化到底是什么意思呢?

    從字面上來理解優化兩個字,意思就是最優值(變量的值不會改變),這里我用一個簡單代碼來說明一下:

    #include <stdio.h>
    int main()

       int a =1;//volatile int a =0;
       
       while(a)
       {
       
       }

    說明:上面的代碼,如果變量a沒有加volatile修飾的話,編譯器就會優化它(也就是a的值一直不變),所以while就一直死循環;然后我如果加了volatile來修飾的話,編譯器就不會去優化變量a,不優化的意思就是說,變量a的值可能就會改變,while就不會一直死循環。

    當然這里為了好理解,我說的不是很專業,沒有從寄存器和內存的角度去說。(我也不想那么去講解,簡單理解了就行)

    總之一句話:上面的結論中,volatile修飾的都是變量,變量就可能改變,不會被編譯器優化;只是說我們上面的結論應用場景不同而已。

    三、總結

    const使得變量具有只讀屬性

    const不能定義真正意義上的常量

    const將具有全局生命周期的變量存儲于只讀存儲區

    volatile強制編譯器減少優化,必須每次從內存中取值


  • <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 东京热 下载