識別符號的作用域,鏈結,儲存

2021-10-24 15:54:59 字數 2552 閱讀 8283

2. 識別符號的生存期

3. 識別符號的儲存

4. extern的使用

翻譯單元:源**檔案.c+其所有標頭檔案.h

不細講

示例:

int glogal =1;

// 外部鏈結(全域性作用域)

static

int file =2;

// 內部鏈結(檔案作用域)

int main

識別符號的四大儲存期:

具有靜態儲存期的變數在程式執行期間將會一直存在

所有的檔案作用域變數(內部鏈結和外部鏈結)都具有靜態儲存期

注意:自動儲存期一般出現在塊作用域中,程式進入塊時,為具有自動儲存期的變數分配記憶體,在程式推出塊時,自動釋放為其分配的記憶體

執行緒儲存期用於併發程式設計中,具有執行緒儲存期的變數,從宣告到執行緒結束前一直存在。

使用malloc動態建立的變數,從malloc建立後到free釋放前一直存在

//malloc與free

#include

intmain()

malloc()引數為需要分配空間的位元組數,free()引數為malloc返回的指標

malloc返回動態分配記憶體塊的首位元組位址,因此要通過乙個指標來接收這個位址,分配空間失敗時返回null空指標

為了提高程式的可讀性,我們常常會使用型別轉換,將malloc返回的位址轉換為匹配的指標型別

free()函式只能夠釋放malloc()動態分配的空間,其他方式(如宣告乙個陣列)分配的空間無法釋放

因為識別符號的儲存方案由識別符號的儲存期和鏈結(作用域)決定,所以確定了儲存方式也就確定了這個變數本身(我們一般根據變數的儲存方式來命名變數)

五個常見儲存方案

儲存類別

儲存期作用域

鏈結宣告方式

自動自動

塊無鏈結

塊內宣告

暫存器自動

塊無鏈結

塊內宣告,使用關鍵字register

靜態無鏈結靜態塊

無鏈結塊內宣告,使用關鍵字static

靜態內部鏈結

靜態檔案

內部鏈結

所有函式外,且有關鍵字static

靜態外部鏈結

靜態檔案

外部鏈結

所有函式外

自動變數是宣告在塊中,在塊作用域上,無鏈結,具有自動儲存期的變數

為了強調制數該變數自動儲存的類別,可以顯示地使用關鍵字auto,確保變數為自動變數(確保自動儲存類別)

自動變數不會自動初始化,只能顯示地初始化(而靜態變數自動初始化為0)

暫存器變數是通過register宣告在塊中,在塊作用域上,無鏈結,具有自動儲存期的變數

與普通的自動變數相比,一般來說 暫存器不儲存在記憶體中而是直接儲存在cpu的暫存器中(「編譯器不一定允許儲存」),因此訪問和處理暫存器變數的速度更快。且因為是儲存在暫存器上,故無法獲得暫存器的儲存位址,不允許指標操作

塊作用域的靜態變數是通過使用關鍵字static宣告在塊中,在塊作用域上,無鏈結,具有靜態儲存期的變數

與普通的自動變數相比,塊作用域的靜態變數在所在函式塊呼叫結束後並不會釋放記憶體,而是一直保留在記憶體中,知道程式執行結束

**示例:

// 塊作用域的靜態變數的特點

內部鏈結的靜態變數是通過關鍵字static宣告在所有函式外,在檔案作用域上,內部鏈結,具有靜態儲存期的變數

外部鏈結的靜態變數是宣告在所有函式外,在檔案作用域上,外部鏈結,具有靜態儲存期的變數

extern"外部",意為 所宣告變數的定義在外部,在別處

#include

int num =1;

// 外部鏈結的靜態變數

static

char ch =

'a';

// 內部鏈結的靜態變數

intmain()

#incldue

int num1 =1;

// 此處定義了該檔案中的乙個外部鏈結的靜態變數num1

extern

int num2;

// 此處是宣告了一其他檔案中的乙個外部鏈結的靜態變數num2

intmain()

總結:

函式內使用extern,那麼「外部」是相對於函式的,也就是指該檔案的函式外

函式外使用extern,那麼「外部」是相對於檔案的,也就是指該檔案外

識別符號的作用域

塊作用域 區域性作用域 檔案作用域 全域性作用域 函式原型作用域 函式作用域 類作用域 塊作用域 塊是函式中一對花括號 包括函式定義所使用的花括號 所括起的一段區域。在塊內說明的識別符號具有塊作用域,它開始於識別符號被說明的地方,並在標誌該塊結束的右花括號處結束。如果乙個塊內有乙個巢狀塊,並且該塊內...

C 識別符號的作用域

轉 包括 區域性作用域 全域性作用域 檔案作用域 函式作用域 函式原型作用域 名空間作用域 類作用域 注意 潛在作用域,也就是同名變數的作用域問題。1.區域性作用域 指在函式定義或者復合語句中,從識別符號的定義點開始到函式或者復合語句結束之間的程式段。在同乙個區域性作用域內不能出現相同名字的兩個區域...

c 變數儲存性質與識別符號作用域

首先 乙個被說明的變數,除名字,型別和值的基本特性外,還有其他特性,包括儲存,作用域,可見性和連續等特性。識別符號儲存特性確定了識別符號在記憶體中的生存時間和連續特性。c 的乙個程式稱為乙個專案。乙個專案可以由多個檔案組成。識別符號的連續特性決定識別符號能否被工程中其他檔案引用。c 中有兩種儲存特性...