關於變數的儲存期,作用域,和鏈結的理解

2021-08-31 11:29:45 字數 1819 閱讀 6962

最近在用c做乙個wifi模組的專案開發,但是對c中變數的應用和工程的體系架構的理解深刻度還不夠,特在這裡對此做乙個總結和框圖化整理。理解有誤處請指正,謝謝。

物件(object):

從硬體角度來說的,指的是被儲存的每個值所占用的物理記憶體;  用儲存期來描述物件,指的是物件在記憶體中保留多長時間。

識別符號(identifier):

從軟體角度來說的,指的是變數宣告的識別符號;識別符號用於訪問物件,可以用作用域(scop)和鏈結(linkage)來描述識別符號,作用域和鏈結表明程式的哪些部分可以使用它。

翻譯單元(translation unit):

編譯器源**檔案和所有的標頭檔案可以看成是乙個包含資訊的單獨檔案,這個檔案成為翻譯單元。如果程式由多個源**檔案組成,那麼程式可以說由多個翻譯單元組成。每個翻譯單元對應乙個源**檔案和它所包含的標頭檔案。

//  儲存期說明

儲存期分為靜態儲存期,執行緒儲存器,自動儲存期,動態分配儲存期

靜態儲存期指的是物件在程式在執行過程中一直存在。注意stastic只表明內部鏈結屬性,而非儲存期。所有檔案作用域變數都具有靜態儲存期。

執行緒儲存期指的是用於併發程式設計,程式執行可被分為多個執行緒。具有執行緒儲存期的物件,從被宣告到執行緒結束時一直存在。

自動儲存期:塊作用域變數。區域性變數都屬於自動儲存期;

注意:塊作用域物件也可以有靜態儲存期。此時要用stastic。

void more (int number)

//  作用域說明

進一步的,作用域可以是塊作用域函式作用域函式原型作用域,或者檔案作用域

塊作用域(定義在塊內的變數,部分形參, 部分迴圈初始化等):

double block(double cleo)    // 變數cleo也屬於塊作用域

注意:形參,for迴圈,while迴圈,do while迴圈等,即使塊作用域的變數不在花括號裡,其作用域也屬於塊作用域。

函式作用域:

僅僅用於goto的標籤。意思是,假如在內層塊中寫乙個標籤,該標籤的作用域會延伸到整個函式。防止大函式塊中出現同名標籤,導致程式混亂。

函式原型作用域:

從形參定義處到原型宣告結束。

void  adc_tmp(int n, int m);  // m, n 編譯器在處理函式原型宣告時只關心它的型別,而形參名通常無 

// 關緊要。

檔案作用域:指的是變數定義在函式的外邊。從定義處到檔案的末尾都可見。由於這種變數可以用於多個函式,因此檔案作用域變數也成為全域性變數。

//  鏈結說明

int giants =5;             //檔案作用域,外部鏈結, 其他翻譯單元也可以使用

static int dodgers =3; //檔案作用域,外部鏈結, 只能在此檔案中使用;

int main()

...

作用域 鏈結 儲存期

作用域,分四種 1.塊作用域 block scope 2.函式作用域 function scope 僅限於goto的標籤 3.函式原型作用域 function prototype scope 3.檔案作用域 file scope 在函式和類之外的說明的識別符號具有檔案作用域,其作用域從說明點開始,在...

linux c儲存期 作用域 鏈結

儲存期 靜態儲存期分配的內存在程式執行期間一直存在 執行緒儲存期分配的記憶體從執行緒生成到執行緒結束之前一直存在 自動儲存期物件一般在塊裡面,當程式進入這個塊時分配記憶體,退出這個塊時就釋放記憶體 動態儲存期手動分配記憶體和釋放記憶體 malloc,calloc 檔案作用域 全域性 塊作用域可見範圍...

C 作用域 儲存期 鏈結

c語言 作用域 儲存期 鏈結屬性 作用域和鏈結描述了識別符號的可見性,作用域描述了這些識別符號的作用範圍,儲存期描述了通過這些識別符號訪問的物件的生存期。1 作用域 塊作用域 用 闊起來的,從宣告開始到 結束 函式作用域 goto 識別符號 的作用域為整個函式。函式原型作用域 函式宣告開始,函式宣告...