1. 程式人生 > >C語言筆記 第九課 const和volatile分析

C語言筆記 第九課 const和volatile分析

第九課 const和volatile分析

const只讀變數

const修飾的變數是隻讀的,本質還是變數
const修飾的區域性變數在棧上分配空間
const修飾的全域性變數在全域性資料區分配空間
const只在編譯期有用,在執行期無用
const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。

const全域性變數的分歧

在現代C語言編譯器中,修改const全域性變數將導致程式崩潰
注意:
標準C語言編譯器不會將const修改的全域性變數儲存於只讀儲存區中,而是儲存於可修改的全域性資料區,其值依然可以改變。
9-1 const的變數本質

const的本質

C語言中的const使得變數具有隻讀屬性
現代C編譯器中的const將具有全域性生命週期的變數儲存於只讀儲存區
const不能定義真正意義上的常量
9-2 const的本質分析

const修飾函式引數和返回值

const修飾函式引數表示在函式體內不希望改變引數的值
const修飾函式返回值表示返回值不可改變,多用於返回指標的情形

小貼士:

C語言中的字串字面量儲存於儲存區中,在程式中需要使用const char*指標。
在這裡插入圖片描述
9-3const修飾函式引數和返回值

深藏不露的volatile

volatile可理解為“編譯器警告指示字”
volatile告訴編譯器必須每次去記憶體中取變數值
volatile主要修飾可能被多個執行緒訪問的變數
volatile也可以修飾可能被未知因數更改的變數
在這裡插入圖片描述

有趣的問題

const volatile int i = 0;
變數i具有什麼樣的特性?
編譯器如何處理這個變數?
變數i 的型別是int,全域性只讀並且不被優化,被volatile修飾,程式中出現i的時候,編譯器每次都會到記憶體取值,不被優化,被const修飾,不能出現在賦值符號的左邊。
小結:
const使得變數具有隻讀屬性
const不能定義真正意義上的常量
const將具有全域性生命期的變數儲存於只讀儲存區
volatile強制編譯器減少優化,必須每次從記憶體中取值
在這裡插入圖片描述