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

C語言詳細分析講解關鍵字const與volatile的用法

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

一、const 只讀變量

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

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

二、const 全局變量的分歧

在現代C語言編譯器中,修改 const 全局變量將導致程序崩潰。

注意:標準C語言編譯器不會將 cons t修飾的全局變量存儲于只讀存儲區(qū)中,而是存儲于可修改的全局數據區(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;
}

下面為輸出結果:

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

三、const 的本質

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

下面看一段 const 本質分析的代碼:

#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;
}

下面為輸出結果:

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

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

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

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

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

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

#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;
}

下面為輸出結果:

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

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

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

五、volatile 解析

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

如下:

六、小結

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

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

相關文章

  • OpenCV實現圖像腐蝕

    OpenCV實現圖像腐蝕

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

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

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

    C++實現簡單掃雷小游戲

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

    C++內聯函數詳情

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

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

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

    C語言實現24點游戲計算器的示例代碼

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

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

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

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

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

    詳談C++ socket網絡編程實例

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

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

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

最新評論

宜阳县| 班戈县| 塔河县| 嘉义市| 永年县| 平谷区| 柳林县| 阿图什市| 河曲县| 巴彦淖尔市| 吉木萨尔县| 旬阳县| 定结县| 永泰县| 科尔| 壤塘县| 丰城市| 遵义县| 郁南县| 若羌县| 繁昌县| 济阳县| 浦县| 娱乐| 扎赉特旗| 乐至县| 宜宾县| 阿瓦提县| 乌鲁木齐市| 普陀区| 抚宁县| 苏尼特右旗| 柘城县| 竹山县| 山东省| 盘山县| 鄂托克前旗| 漳州市| 营口市| 潞城市| 大关县|