關於C語言中儲存類別、連結的總結
阿新 • • 發佈:2019-02-10
作用域
作用域描述程式中可訪問識別符號的區域,一個C變數的作用域有塊作用域、函式作用域、函式原型作用域或檔案作用域。
m定義在塊中,具有塊作用域,n為函式形參,具有函式原型作用域,範圍從形參定義處到原型宣告結束。這意味著編譯器在處理函式原型中的形參時只關心他的型別,而形參名通常無關緊要。變數定義在函式外面(units)具有檔案作用域,從他的定義處到定義所在的檔案末尾均可見。int block(int n) { int m; …… }
int units=0;
int main()
{
}
連結
C變數有三種連結屬性:外部連結,內部連結或無連結具有塊作用域、函式原型作用域、函式作用域的變數都是無連結變數,這些變數只屬於定義他們的塊,函式或原型私有。具有檔案作用域的變數可以是外部連結或內部連結,外部連結變數可以在多檔案程式中使用,內部連結變數只能在一個翻譯單元中使用。外部連結的檔案作用域一般簡稱為“全域性作用域”int a=0; static int b=0; int main() { …… }
b使用了static識別符號,即為內部連結,a為外部連結
儲存期
C物件有四種儲存期:靜態儲存期、執行緒儲存期、自動儲存期、動態分配儲存期。檔案作用域變數具有靜態儲存期,在程式執行期間一直存在。執行緒儲存期用於併發程式設計,從被宣告到執行緒結束一直存在。塊作用域具有自動儲存期,進入塊分配記憶體,退出塊時釋放記憶體,變長陣列稍有不同,儲存期從宣告處開始,而不是從塊開始處但是若在塊中使用static int a形式,此變數將成為靜態儲存期,但是依然屬於塊作用域(即只有在塊中才能使用a訪問該物件),但是該函式可以給其他函式提供該儲存區的地址以便間接訪問該物件,例如通過指標形參或返回值靜態變數和外部變數在程式被載入記憶體時已執行完畢外部連結的靜態變數
如果一個原始碼檔案使用的外部變數定義在另一個原始碼檔案中,必須用extern宣告,但不要用extern定義一個變數儲存類別說明符
auto說明符表明變數為自動儲存期(當變數同名時表明意圖)register說明符把變數歸為暫存器儲存類別,並且保護地址不被訪問(只適用於塊作用域)static說明符表明變數具有靜態儲存期extern說明符表明宣告的變數定義在別處好的程式可以不需要使用檔案作用域變數!!!!!函式也有儲存類別,當希望一個函式只在該檔案中使用,用static宣告。當使用全域性變數且不希望被修改時,記得用CONST分配記憶體 double *ptd;
ptd=(double*)malloc(30*sizeof(double)); free(ptd);
malloc()返回動態分配記憶體的首位元組地址,可以像使用陣列名一樣使用ptd,分配失敗將返回空指標