注意:作用域和生命週期要特別注意區分概念。
全域性變數:定義在函式外。
區域性變數:定義在函式內。
塊變數:定義在if,for,while等語句塊中。
初始化區域性變數和全域性變數
當區域性變數被定義時,系統不會對其初始化,您必須自行對其初始化。定義全域性變數時,系統會自動對其初始化,如下所示:
資料型別
初始化預設值
int0
char
『\0』
float
0double
0pointer
null
auto:
用來定義申請記憶體、自動釋放記憶體的變數(區域性、塊變數,預設被auto修飾)。申請和釋放的都是訪問許可權,不是資料。
注意:auto只能用在函式內,即auto 只能修飾區域性變數。全域性變數和static變數不能被auto修飾。因為它們的記憶體段不同。
const:
是對變數提供一種保護機制,但它不一定是常量。
const變數一旦初始化後,就不能再顯式地修改它的值。但是可以通過指標來修改。
const修飾被初始化過的全域性變數才是真正的常量,一旦修改就出現段錯誤,因為編譯器把這種全域性變數的儲存位置劃分進了記憶體的**段。
#include
const
int num2;
//未初始化的全域性變數
const
int num3 =13;
//已初始化的全域性變數
intmain()
注意:const int func(void);const 修飾的是函式的返回值
static:
儲存類指示編譯器在程式的生命週期內保持區域性變數的存在,而不需要在每次它進入和離開作用域時進行建立和銷毀。
注意:static int func(void); static 修飾的是函式(由普通函式變為內部函式),只能在當前檔案內呼叫。
register:
計算機的儲存介質(從慢到快):硬碟 -> 固態硬碟 -> 記憶體 -> 快取 -> 暫存器
register關鍵字申請把變數的儲存位置更改為暫存器。僅僅是申請,因為暫存器數量有限或者硬體不同,不一定成功。
適用場景:如果要寫乙個死迴圈,其中有乙個變數要頻繁計算,那麼就應該修飾為register,比如計數器。可以大大提高運算效率。
volatile:
(不穩定的,易變的):修飾執行緒間共享的變數,或者硬體程式設計時使用。
如果乙個變數的值沒有顯式的修改,編譯器不會再次從記憶體中讀取它的數值,而是直接使用上次的讀取結果(優化過程)。
volatile的功能就是告訴告訴編譯器變數的值隨時可能發生變化,不要優化它的取值過程(每次用到變數時都去記憶體中獲取它的值)
int num =10;
num == num;
//永遠為真。
volatile
int num1 =20;
num1 == num1;
//不一定為真,多執行緒或者硬體改變時。
extern:
多檔案中共享全域性變數時使用。誰使用誰宣告。可以這麼理解,extern 是用來在另乙個檔案中宣告乙個全域性變數或函式。
定義的含義:建立變數名,分配儲存空間
宣告的含義:建立變數名
a.c中定義乙個全域性變數,b.c中如果想使用,共享乙個變數。
c 之變數作用域
作用域是程式的乙個區域,一般來說有三個地方可以定義變數 我們將在後續的章節中學習什麼是函式和引數。本章我們先來講解宣告是區域性變數和全域性變數。在函式或乙個 塊內部宣告的變數,稱為區域性變數。它們只能被函式內部或者 塊內部的語句使用。下面的例項使用了區域性變數 include iostream us...
C 之變數作用域
在函式或乙個 塊內部宣告的變數,稱為區域性變數。在函式引數的定義中宣告的變數,稱為形式引數。在所有函式外部宣告的變數,稱為全域性變數。整數常量可以是十進位制 八進位制或十六進製制的常量。字首指定基數 0x 或 0x 表示十六進製制,0 表示八進位制,不帶字首則預設表示十進位制。整數常量也可以帶乙個字...
C語言之變數與常量
關於變數 常量 型別和運算子等。2.1 變數名 變數名由字母和數字組成,首字母必須是字母,下劃線 看作是字母,所以可以放在首字母。但是,盡量不用用下劃線作為首字母,因為在庫函式中經常這樣命名。變數名用小寫字母,符號常量用大寫字母。變數名字的選擇需要根據實際目的,區域性變數用短名,外部變數用長名。2....