C語言詳細分析講解關(guān)鍵字const與volatile的用法
一、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類),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04C++ sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法分享
一般情況下播放視頻時不需要旋轉(zhuǎn),但是如果是移動端錄制的視頻有時會出現(xiàn)rotate參數(shù),且視頻寬高也是互換的。所以本文為大家準備了利用sdl實現(xiàn)渲染旋轉(zhuǎn)視頻的方法,需要的可以參考一下2022-12-12C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學生成績管理系統(tǒng)
這篇文章主要為大家詳細介紹了C語言利用結(jié)構(gòu)體數(shù)組實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01