遠程學習和教育的概念。在線教程和視頻課程,研究和畢業,科學研討會,數字網絡學習,測試和文學
內存用于存儲程序中的數據,由存儲期、作用域和鏈接表征。存儲期可以是靜態的、自動的或動態分配的。如果是靜態存儲期,在程序開始執行時分配內存,并在程序運行時都存在。如果是自動存儲期,在程序進入變量定義所在塊時分配變量的內存,在程序離開塊時釋放內存。
如果是動態分配存儲期,在調用malloc()(或相關函數)時分配內存,在調用free()函數時釋放內存。作用域決定程序的哪些部分可以訪問某數據。定義在所有函數之外的變量具有文件作用域,對位于該變量聲明之后的所有函數可見。
定義在塊或作為函數形參內的變量具有塊作用域,只對該塊以及它包含的嵌套塊可見。鏈接描述定義在程序某翻譯單元中的變量可被鏈接的程度。具有塊作用域的變量是局部變量,無鏈接。具有文件作用域的變量可以是內部鏈接或外部鏈接。內部鏈接意味著只有其定義所在的文件才能使用該變量。外部鏈接意味著其他文件使用也可以使用該變量。下面是C的5種存儲類別(不包括線程的概念)。
下面是C的5種存儲類別(不包括線程的概念)。
- 自動:在塊中不帶存儲類別說明符或帶auto存儲類別說明符聲明的變量(或作為函數頭中的形參)屬于自動存儲類別,具有自動存儲期、塊作用域、無鏈接。如果未初始化自動變量,它的值是未定義的。
- 寄存器——在塊中帶register存儲類別說明符聲明的變量(或作為函數頭中的形參)屬于寄存器存儲類別,具有自動存儲期、塊作用域、無鏈接,且無法獲取其地址。把一個變量聲明為寄存器變量即請求編譯器將其存儲到訪問速度最快的區域。如果未初始化寄存器變量,它的值是未定義的。
- 靜態、無鏈接——在塊中帶static存儲類別說明符聲明的變量屬于“靜態、無鏈接”存儲類別,具有靜態存儲期、塊作用域、無鏈接。只在編譯時被初始化一次。如果未顯式初始化,它的字節都被設置為0。
- 靜態、外部鏈接——在所有函數外部且沒有使用static存儲類別說明符聲明的變量屬于“靜態、外部鏈接”存儲類別,具有靜態存儲期、文件作用域、外部鏈接。只能在編譯器被初始化一次。如果未顯式初始化,它的字節都被設置為0。
- 靜態、內部鏈接——在所有函數外部且使用了static存儲類別說明符聲明的變量屬于“靜態、內部鏈接”存儲類別,具有靜態存儲期、文件作用域、內部鏈接。只能在編譯器被初始化一次。如果未顯式初始化,它的字節都被設置為0。
動態分配的內存由malloc()(或相關)函數分配,該函數返回一個指向指定字節數內存塊的指針。這塊內存被free()函數釋放后便可重復使用,free()函數以該內存塊的地址作為參數。
類型限定符const、volatile、restrict和_Atomic。const限定符限定數據在程序運行時不能改變。對指針使用const時,可限定指針本身不能改變或指針指向的數據不能改變,這取決于const在指針聲明中的位置。volatile限定符表明,限定的數據除了被當前程序修改外還可以被其他進程修改。該限定符的目的是警告編譯器不要進行假定的優化。restrict限定符也是為了方便編譯器設置優化方案。restrict限定的指針是訪問它所指向數據的唯一途徑。