欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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 全局變量將導致程序崩潰。

注意:標準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é)果:

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

這就對應上面說的,如果修改 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)文章

  • QT線程池的使用(QThreadPool類和QRunnable類)

    QT線程池的使用(QThreadPool類和QRunnable類)

    本文主要介紹了QT線程池的使用(QThreadPool類和QRunnable類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C語言實現(xiàn)掃雷小游戲的示例代碼

    C語言實現(xiàn)掃雷小游戲的示例代碼

    這篇文中主要為大家詳細介紹了如何利用C語言實現(xiàn)經(jīng)典的掃雷小游戲。掃雷小游戲主要是利用字符數(shù)組、循環(huán)語句和函數(shù)實現(xiàn),感興趣的小伙伴可以了解一下
    2022-10-10
  • C++ sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享

    C++ sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享

    一般情況下播放視頻時不需要旋轉(zhuǎn),但是如果是移動端錄制的視頻有時會出現(xiàn)rotate參數(shù),且視頻寬高也是互換的。所以本文為大家準備了利用sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法,需要的可以參考一下
    2022-12-12
  • C++學習之Lambda表達式的用法詳解

    C++學習之Lambda表達式的用法詳解

    Lambda?表達式(lambda?expression)是一個匿名函數(shù),Lambda表達式基于數(shù)學中的λ演算得名。本文就來為大家詳細講講C++中Lambda表達式的使用,需要的可以參考一下
    2022-07-07
  • C++實現(xiàn)數(shù)獨快速求解

    C++實現(xiàn)數(shù)獨快速求解

    這篇文章主要為大家詳細介紹了C++實現(xiàn)數(shù)獨快速求解的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學生成績管理系統(tǒng)

    C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C語言實現(xiàn)三子棋小游戲的示例代碼

    C語言實現(xiàn)三子棋小游戲的示例代碼

    這篇文章主要介紹了如何通過C語言實現(xiàn)三子棋小游戲,三子棋小游戲的實現(xiàn)主要依賴于循環(huán)語句、函數(shù)和數(shù)組,感興趣的小伙伴可以嘗試一下
    2022-10-10
  • C語言小程序 數(shù)組操作示例代碼

    C語言小程序 數(shù)組操作示例代碼

    對數(shù)組進行操作,查找、插入、刪除
    2013-07-07
  • C++ vector容器縮小capacity問題

    C++ vector容器縮小capacity問題

    這篇文章主要介紹了C++ vector容器縮小capacity問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言 詳細講解接續(xù)符和轉(zhuǎn)義符的使用

    C語言 詳細講解接續(xù)符和轉(zhuǎn)義符的使用

    接續(xù)符是用來告訴編譯器行為的符號,那編譯器遇到接續(xù)符是什么行為呢,就是去掉接續(xù)符,然后把下一行連接到現(xiàn)在這行上面,轉(zhuǎn)義符是主要用于表示無回顯字符,也用于表示常規(guī)字符,轉(zhuǎn)義符必須放在單引號或者雙引號里面
    2022-04-04

最新評論