作用域
作用域描述了程序中可以訪問一個標識符的一個或多個區域
- 塊作用域
- 一對花括號括起來的區域,定義在塊中的變量有塊作用域
- 函數的形式參數也屬於塊作用域
- 局部變量具有塊作用域
- 函數作用域
- 僅限於goto語句
- 即使一個標籤首次出現在函數的內層塊中,它的作用域也延伸至整個函數
- 函數原型作用域
從形參定義到原型聲明結束 - 文件作用域
- 變量定義在函數外面,具有文件作用域
- 從它定義的位置開始,到文件結束
- 也稱爲全局變量
鏈接
具有文件作用域的變量可能有外部或者內部鏈接
- 外部鏈接
可以在一個多文件程序的任何地方使用 - 內部鏈接
只能在一個翻譯單元(一個源代碼文件和它所包含的頭文件)中使用
需要注意定義與頭文件包含的順序問題,需要先定義後包含,頭文件才能使用相應的變量
內部鏈接不能用extern聲明 - 空鏈接
代碼塊作用域、函數作用域、函數原型作用域的變量有空鏈接
意味着它們是由其定義所在的代碼塊或者函數原型私有的
存儲時期
- 靜態存儲期
程序執行期間一直存在 - 線程存儲期
從被聲明到線程結束一直存在 - 自動存儲期
塊作用域的變量通常具有自動存儲期
進入塊時分配空間,退出時釋放空間 - 動態分配存儲期
自動變量
自動存儲期,塊作用域,無鏈接
關鍵字:auto
如果編寫兼容c++的程序,最好不要用auto關鍵字
寄存器變量
塊作用域,無鏈接,自動存儲期
關鍵字:register
請求成功則獲得寄存器變量
失敗則獲得存儲在內層的普通變量
函數的存儲類別
外部函數
默認是外部函數
可以被其它文件訪問
靜態函數
只能用於所定義的文件
內聯函數
定義在頭文件中,可以重複包含
malloc
void *malloc(size_t size);
傳入要分配的字節數,返回分配的地址,失敗返回NULL
calloc
void *calloc(size_t n, size_t size);
分配N個 大小爲SIZE的空間,並且全部初始化爲0
free
釋放分配的空間,否則造成內存泄漏
ANSI 類型限定符
const
定義普通變量時,該變量不能被改變
定義指針時,在*
左側,則指向的值不能被改變
在*
右側,則指向不能被改變
volatile
通常用於硬件地址,以及在其它程序或同時運行的線程中共享數據
restrict
允許編譯器優化某部分的代碼以更好的支持計算
它只能用於指針,表明該指針是訪問數據對象的唯一方式
_Atomic
當一個線程對一個原子類型的對象執行原子操作時,其他線程不能訪問該對象
冪等
C99爲類型限定符增加了冪等性,可以在一條聲明中多次使用同一個限定符,多餘的限定符將會被忽略
const const const const int a=10;
const int a = 10;
以上是等價的