C各種變數的儲存機制 作用域規則以及初始化

2021-07-14 10:03:58 字數 1998 閱讀 2916

一、變數型別

externel和internal簡介:

internel用於描述定義在函式內部的函式變元和變數。外部變數在函式外部定義,故可以在很多函式中使用。由於c語言不允許在乙個函式中定義其他函式,因此函式本身是外部的。預設情況下,外部變數和函式具有如下性質:所有通過名字對外部變數和函式的引用都是引用同乙個物件(即外部鏈結)。

由於外部變數是可以全域性訪問的,這就為在函式之間交換資料提供了一種可以代替函式變元與返回值的方法。任何函式都可以用名字來訪問外部變數,只要這個名字在某個地方已經做了說明。但是使用太多的外部變數,會導致對**結構產生不好的影響,而且可能會使程式在各個函式之間產生太多的資料聯絡。

外部變數的用途還表現在他們比內部變數有更大的作用域和更長的生存週期。

1、自動變數(auto)

自動變數只能在函式內部使用,當其所在函式開始呼叫時開始存在,當函式退出時消失。

作用域規則:說明該自動變數的函式。對於函式引數也是如此,函式引數可看作區域性變數。

2、靜態變數(static)

儲存機制:靜態儲存。

static說明適用於外部變數和函式時,用於把這些物件的作用域限定為被編譯原始檔的剩餘部分。

static說明適用於內部變數時,和自動變數一樣只能在該函式內部使用,但是與自動變數不同的是,不管其所在函式是否被呼叫,它都是一直存在的。即內部靜態變數是一種只能在某一函式內部使用的但一直佔據儲存空間的變數。

3、暫存器變數(register)

register說明用於提醒編譯程式所說明的變數在程式中使用頻率較高。其思想是,將暫存器變數放在機器的暫存器中,這樣使程式更小、執行速度更快。但編譯程式可以忽略此選項。

暫存器說明只適用於自動變數以及函式的形式引數。

4、外部變數(extern)

外部變數是永久儲存的,他們的值在從一次函式呼叫到下次函式呼叫之間保持不變。因此如果兩個函式必須共享某些資料,而且這兩個函式有互不呼叫對方,那麼把這些共享資料作為外部變數表示,比用函式變元更好。

作用域規則:從其說明處開始,一直到其所在的被編譯的檔案的末尾。函式的作用域也是如此。另外,如果乙個外部變數在定義之前就要被用到,或者這個外部變數定義在與所要使用的它的原始檔不相同的原始檔中,那麼要在相應的變數說明中強制性使用關鍵字extern。

將對外部變數的說明與定義嚴格區分開來非常重要,變數說明用於通報變數的性質(主要是變數的型別),而變數定義則除此以外還引起儲存分配。

例:如果在函式的外部有如下說明:

int sp;

double val[max_path];

則這兩個說明定義了兩個外部變數sp和val,並為之分配了儲存空間,同時也用作原始檔其他部分使用的說明。

而:extern int sp;

extern double val[max_path];

則:為原始檔剩餘部分說明了兩個外部變數,但是這兩個說明並沒有建立變數或為他們分配儲存空間。

在乙個源程式的所有原始檔中對乙個外部變數只能在某個檔案中定義一次,而其他檔案可以通過extern說明來訪問它。在外部變數的定義中必須指定陣列的大小,但在extern說明中,則不一定要指定陣列的大小。

外部變數的初始化只能出現在其定義中。

二、變數的初始化

在沒有顯式初始化的情況下,外部變數和靜態變數都被初始化為0。而自動變數和暫存器變數的初始值則沒有定義。

在定義純量變數時,可以通過在所定義的變數名後面加乙個「=」和乙個表示式進行初始化。如:

int i = 1;

對於外部變數和區域性變數,初始化符必須是常量表示式,初始化只作一次(從概念上講是在程式開始執行之前進行初始化)。

對於自動變數和暫存器變數,則在每當進入函式或分程式時進行初始化。初始化符不一定限定為常量,它可以是任何表示式,甚至可以包含函式呼叫。實際上,自動變數的初始化部分就是賦值語句的縮寫。

陣列的初始化:

也是通過說明中初始化符來完成的,陣列初始化符用「{}」括住,並用逗號分隔。

如果初始化符序列中的初始化符的個數比陣列元素少時,那麼對於沒有得到初始化的陣列元素在該陣列為自動變數、外部變數、靜態變數時都被初始化為0。

出處:

C各種變數的儲存機制 作用域規則以及初始化

本文只作為個人防止忘記,作為基礎資料來查閱所用。一 變數型別 externel和internal簡介 internel用於描述定義在函式內部的函式變元和變數。外部變數在函式外部定義,故可以在很多函式中使用。由於c語言不允許在乙個函式中定義其他函式,因此函式本身是外部的。預設情況下,外部變數和函式具有...

C 變數的儲存類別與作用域

總結一下c 中變數的儲存類別以及變數的作用域。1 標示符的儲存類別決定了標示符在記憶體中存在的時間 我們可以理解標示符就是確定乙個變數的符號,也就是我們所說的變數名 二 儲存類別 1 靜態儲存類別 靜態存數類別變數 我們簡稱靜態變數 從程式的開始處就存在,其生命期伴隨整個程式。2 自動儲存類別 當變...

C語言的作用域規則

程式中名字的作用域,通俗的講,就是這個名字在程式中的使用範圍。在c語言中,作用域的規則相對比較簡單,主要分為全域性作用域和區域性作用域兩種。乙個變數如果定義在函式中,那麼這個變數的作用域就是乙個區域性作用域,在函式外面不能訪問這個變數。在別的函式中定義同名的變數,也不會出現名字衝突,因為它們都處於各...