1. 程式人生 > >關於C語言中儲存類別、連結的總結

關於C語言中儲存類別、連結的總結

作用域

作用域描述程式中可訪問識別符號的區域一個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,分配失敗將返回空指標
儲存類別和動態記憶體分配
程式可用的記憶體分為三部分一部分靜態變數使用一部分自動變數使用一部分動態記憶體使用自動變數記憶體通常作為來處理,動態記憶體通常比棧記憶體慢。

限定符

restrict

只能用於指標,表明該指標是訪問資料物件的唯一且初始的方式。
volatile
代理可以改變該變數的值,通常被用於硬體地址以及在其他程式或同時執行的執行緒中共享資料。
_Atomic
當一個執行緒對一個原子型別的物件執行原子操作時,其他執行緒不能訪問該物件