您好,登錄后才能下訂單哦!
今天小編給大家分享一下C語言關鍵字const與volatile怎么用的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
const 修飾的變量是只讀的,本質還是變量
const 修飾的局部變量在棧上分配空間
const 修飾的全局變量在全局數據區分配空間
const 只在編譯期有用,在運行期無用
const 修飾的變量不是真的常量,它只是告訴編譯器該變量不能出現在賦值符號的左邊。
在現代C語言編譯器中,修改 const 全局變量將導致程序崩潰。
注意:標準C語言編譯器不會將 cons t修飾的全局變量存儲于只讀存儲區中,而是存儲于可修改的全局數據區,其值依然可以改變。
下面看一段代碼:
#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 修飾的全局變量則不能通過指針來修改里面的值,會發生段錯誤。
C 語言中的 const 使得變量具有只讀屬性
現代 C 編譯器中的 const 將具有全局生命周期的變量存儲于只讀存儲區(staic 修飾的變量也有全局生命周期,所以用 const 修飾后也存儲于只讀存儲區)
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 修飾的全局生命周期的變量,程序就會發生崩潰。
const 修飾函數參數表示在函數體內不希望改變參數的值
const 修飾函數返回值表示返回值不可改變,多用于返回指針的情形
小貼士:C 語言中的字符串字面量存儲于只讀存儲區中,在程序中需要使用 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 也可以修飾可能被未知因數更改的變量
如下:
以上就是“C語言關鍵字const與volatile怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。