C 語言學習筆記(二)存儲類型介紹
C語言5種存儲類別
存儲類別 |
聲明方式 |
存儲期 |
作用域 |
鏈接 |
自動 |
塊內 |
自動 |
塊 |
無 |
寄存器 |
塊內,使用關鍵字 register |
自動 |
塊 |
無 |
靜態外部鏈接 |
所有函數外 |
靜態存儲 |
文件 |
外部 |
靜態內部鏈接 |
所有函數外,使用關鍵字 static |
靜態存儲 |
文件 |
內部 |
靜態無鏈接 |
塊內,使用關鍵字 static |
靜態存儲 |
塊 |
無 |
- 自動變量
***塊作用域和無鏈接意味着只有在變量定義所在的塊中才能通過變量名訪問該變量。
***變量具有自動存儲期意味着,程序在進入該變量聲明所在的塊時變量存在,程序在退出該塊時變量消失。
- 寄存器變量
寄存器變量儲存在 CPU 的寄存器中,或者概況地說,儲存在最快的可用內存中訪問和處理變量速度更快。
- 塊作用域的靜態變量
靜態變量是指該變量在內存中原地不動,並不是說它的值不變。
- 外部鏈接的靜態變量(external variable)
通過用關鍵字 extern 再次聲明,指出使用了外部變量。
外部變量只能初始化一次,且必須在定義該變量時進行。
- 內部鏈接的靜態變量
在所有函數外部,用存儲類別說明符 static 定義的變量爲靜態變量。
內部鏈接的靜態變量只能用於統一個文件中的函數。可以使用 extren 在函數中重複聲明任何具有文件作用域的變量。
- 多文件
如果外部變量定義在一個文件中,那麼其他文件在使用該變量之前必須先聲明它(使用 extern 關鍵字)。
- 存儲類別說明符
C語言有6個關鍵字作爲存儲類別說明符:auto、register、static、extern、_Thread_local、typedef.
typedef 關鍵字與任何內存存儲無關。
auto:表明變量是自動存儲期,只能用於塊作用域的變量聲明中。使用 auto 主要是爲了明確表達要使用與外部變量同名的局部變量的意圖。
register:只用於塊作用域的變量,它把變量歸爲寄存器存儲類別,請求最快速度訪問該變量。同時,確保該變量地址不被獲取.
static: 創建的變量具有靜態存儲期,載入程序時創建對象,當程序結束時對象消失。
extern: 表明聲明的變量定義在別處。
- 存儲類別和函數
包括外部函數(默認)或靜態函數(用 static 標識)
- 分配內存:malloc()和 free()、calloc()
動態申請內存malloc(20*sizeof(int))、calloc(20, sizeof(int)) ,free()函數釋放 malloc 和 calloc函數申請的內存空間,不及時釋放內存會造成內存泄露。不能釋放同一內存兩次。
- const 類型限定符
以關鍵字 const 聲明的對象,其值不可修改。
const float *pf; pf 指向一個 float 類型的 const值。 創建 pf指向的值不能被改變,而 pt 本身的值可以改變。
float *const pt; pt 是一個const 指針,創建的指針 pt 本身的值不能更改。
const float *const ptr;表明 ptr 既不能指向別處,它所指向的值也不能改變。
- volatile類型限定符
volatile限定符告知計算機,代理(而不是變量所在的程序)可以改變該變量的值。
- restrict 類型限定符
restrict 關鍵字編譯器優化某部分代碼已更好地支持計算。它只能用於指針,表明該指針是訪問數據對象的唯一且初始的方式。