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

