最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言詳細分析講解關(guān)鍵字const與volatile的用法

 更新時間:2022年04月20日 17:03:38   作者:清風自在?流水潺潺  
在C語言中,我們經(jīng)常會見到const和volatile這兩個關(guān)鍵字,那么我們今天就來介紹下這兩個關(guān)鍵字,提起?const?關(guān)鍵字,我們可能首先想到的是經(jīng)過它修飾的變量便是常量了。其實我們這種想法是錯誤的,其實?const?修飾的變量是只讀的,其本質(zhì)還是變量

一、const 只讀變量

  • const 修飾的變量是只讀的,本質(zhì)還是變量
  • const 修飾的局部變量在棧上分配空間
  • const 修飾的全局變量在全局數(shù)據(jù)區(qū)分配空間
  • const 只在編譯期有用,在運行期無用

const 修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現(xiàn)在賦值符號的左邊。

二、const 全局變量的分歧

在現(xiàn)代C語言編譯器中,修改 const 全局變量將導(dǎo)致程序崩潰。

注意:標準C語言編譯器不會將 cons t修飾的全局變量存儲于只讀存儲區(qū)中,而是存儲于可修改的全局數(shù)據(jù)區(qū),其值依然可以改變。

下面看一段代碼:

#include <stdio.h>
 
const int g_cc = 2;
 
int main()
{
    const int cc = 1;
    
    int* p = (int*)&cc;
    
    printf("cc = %d\n", cc);
    
    *p = 3;
    
    printf("cc = %d\n", cc);
    
    p = (int*)&g_cc;
    
    printf("g_cc = %d\n", g_cc);
    
    *p = 4;
    
    printf("g_cc = %d\n", g_cc);
    
    return 0;
}

下面為輸出結(jié)果:

上面代碼說明 const 修飾的局部變量可以通過指針修改里面的值,但是 const 修飾的全局變量則不能通過指針來修改里面的值,會發(fā)生段錯誤。

三、const 的本質(zhì)

  • C 語言中的 const 使得變量具有只讀屬性
  • 現(xiàn)代 C 編譯器中的 const 將具有全局生命周期的變量存儲于只讀存儲區(qū)(staic 修飾的變量也有全局生命周期,所以用 const 修飾后也存儲于只讀存儲區(qū))
  • const 不能定義真正意義上的常量

下面看一段 const 本質(zhì)分析的代碼:

#include <stdio.h>
 
const int g_array[5] = {0};
 
void modify(int* p, int v)
{
    *p = v;
}
 
int main()
{
    int const i = 0;
    const static int j = 0;
    int const array[5] = {0};
    
    modify((int*)&i, 1);           // ok
    //modify((int*)&j, 2);           // error
    modify((int*)&array[0], 3);    // ok
    //modify((int*)&g_array[0], 4);  // error
    
    printf("i = %d\n", i);
    printf("j = %d\n", j);
    printf("array[0] = %d\n", array[0]);
    printf("g_array[0] = %d\n", g_array[0]);
    
    return 0;
}

下面為輸出結(jié)果:

如果把注釋去掉,就會報段錯誤:

這就對應(yīng)上面說的,如果修改 const 修飾的全局生命周期的變量,程序就會發(fā)生崩潰。

四、const 修飾函數(shù)參數(shù)和返回值

  • const 修飾函數(shù)參數(shù)表示在函數(shù)體內(nèi)不希望改變參數(shù)的值
  • const 修飾函數(shù)返回值表示返回值不可改變,多用于返回指針的情形

小貼士:C 語言中的字符串字面量存儲于只讀存儲區(qū)中,在程序中需要使用 const char* 指針。

下面看一段const 修飾函數(shù)參數(shù)與返回值的代碼吧:

#include <stdio.h>
 
const char* f(const int i)
{
    //i = 5;
    
    return "Autumn Ze";
}
 
int main()
{
    const char* pc = f(0);
    
    printf("%s\n", pc);
    
    //pc[6] = '_';
    
    //printf("%s\n", pc);
    
    return 0;
}

下面為輸出結(jié)果:

如果把下面的語句去掉注釋

    //pc[6] = '_';
    
    //printf("%s\n", pc);

運行程序就會報錯,不能嘗試去修改只讀變量:

五、volatile 解析

  • volatile 可理解為“編譯器警告指示字”
  • volatile 告訴編譯器必須每次去內(nèi)存中取變量值
  • volatile 主要修飾可能被多個線程訪問的變量
  • volatile 也可以修飾可能被未知因數(shù)更改的變量

如下:

六、小結(jié)

  • const 使得變量具有只讀屬性
  • const 不能定義真正意義上的常量
  • const 將具有全局生命期的變量存儲于只讀存儲區(qū)
  • volatile 強制編譯器減少優(yōu)化,必須每次從內(nèi)存中取值

到此這篇關(guān)于C語言詳細分析講解關(guān)鍵字const與volatile的用法的文章就介紹到這了,更多相關(guān)C語言 const與volatile內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • OpenCV實現(xiàn)圖像腐蝕

    OpenCV實現(xiàn)圖像腐蝕

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)圖像腐蝕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • c/c++那些你一定會出錯的數(shù)組筆試題匯總

    c/c++那些你一定會出錯的數(shù)組筆試題匯總

    這篇文章主要給大家匯總介紹了關(guān)于c/c++那些你一定會出錯的數(shù)組筆試題,除了基本數(shù)據(jù)類型之外,其余的都作為類對象,包括數(shù)組,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • C++實現(xiàn)簡單掃雷小游戲

    C++實現(xiàn)簡單掃雷小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡單掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++內(nèi)聯(lián)函數(shù)詳情

    C++內(nèi)聯(lián)函數(shù)詳情

    這篇文章主要介紹了C++內(nèi)聯(lián)函數(shù),文章主要圍繞C++內(nèi)聯(lián)函數(shù)的相關(guān)資料展開詳細內(nèi)容,需要的朋友可以參考一下,希望對大家有所幫助
    2021-11-11
  • C語言 函數(shù)指針(指向函數(shù)的指針)詳解

    C語言 函數(shù)指針(指向函數(shù)的指針)詳解

    本文主要介紹 C語言函數(shù)指針的知識,這里整理了詳細的資料及示例代碼以便大家學(xué)習參考,有需要學(xué)習此部分知識的朋友可以參考下
    2016-08-08
  • C語言實現(xiàn)24點游戲計算器的示例代碼

    C語言實現(xiàn)24點游戲計算器的示例代碼

    24點是一種益智游戲,24點是把4個整數(shù)(一般是正整數(shù))通過加減乘除以及括號運算,使最后的計算結(jié)果是24的一個數(shù)學(xué)游戲,24點可以考驗人的智力和數(shù)學(xué)敏感性,它能在游戲中提高人們的心算能力。本文將用C語言實現(xiàn)這一游戲,感興趣的可以了解一下
    2022-08-08
  • C++ 自定義控件的移植問題

    C++ 自定義控件的移植問題

    這篇文章主要介紹了C++ 自定義控件的移植問題,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-06-06
  • C語言圖文并茂詳解鏈接過程

    C語言圖文并茂詳解鏈接過程

    首先來思考一個問題:工程中的每個C語言源文件被編譯后生成的目標文件,這些目標文件如何生成最終的可執(zhí)行程序? 這就需要這節(jié)我們將要分析的鏈接器
    2022-04-04
  • 詳談C++ socket網(wǎng)絡(luò)編程實例

    詳談C++ socket網(wǎng)絡(luò)編程實例

    這篇文章主要為大家介紹了C++ socket網(wǎng)絡(luò)編程實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 教你Visual?Studio?2022如何新建一個C語言工程(圖文詳解)

    教你Visual?Studio?2022如何新建一個C語言工程(圖文詳解)

    這篇文章主要介紹了Visual?Studio?2022如何新建一個C語言工程,本文給大家介紹的非常詳細,對大家的學(xué)習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09

最新評論

林甸县| 宾川县| 新津县| 彰化县| 永安市| 辛集市| 英德市| 独山县| 东丽区| 吉安县| 万荣县| 滁州市| 罗江县| 亚东县| 临江市| 岱山县| 虹口区| 高雄市| 西平县| 肥城市| 华亭县| 兴海县| 兴和县| 大庆市| 轮台县| 长阳| 定日县| 沭阳县| 固阳县| 兴宁市| 正定县| 宁南县| 德保县| 大名县| 旌德县| 东乡族自治县| 腾冲县| 吉安县| 亳州市| 永顺县| 康定县|