【C語言】18-變量類型


說明:這個C語言專題,是學習iOS開發的前奏。也為了讓有面向對象語言開發經驗的程序員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略

C語言有豐富的數據類型和運算符,因此計算能力非常強大,計算過程中使用的值一般用變量來存儲。變量也是有分類型的,不同類型的變量有不同的存儲類型、不同的生命周期、不同的作用域,C語言也提供了一些關鍵字來設置變量的屬性(比如設置存儲類型、生命周期)。

 一、變量的作用域

C語言根據變量作用域的不同,將變量分為局部變量和全局變量。

1.局部變量

1> 定義:在函數內部定義的變量,稱為局部變量。形式參數也屬於局部變量

2> 作用域:局部變量只在定義它的函數內部有效,即局部變量只有在定義它的函數內部使用,其它函數不能使用它。

 

2.全局變量

1> 定義:在所有函數外部定義的變量,稱為全局變量。

2> 作用域:全局變量的作用范圍是從定義變量的位置開始到源程序結束,即全局變量可以被在其定義位置之后的其它函數所共享。

1 int a;
2 
3 int main ()
4 {
5     int b;
6     return 0;
7 }

第1行的變量a是全局變量,第5行的變量b是局部變量。

 

二、變量的存儲類型

* 變量的存儲類型就是指變量存儲在什么地方。有3個地方可以用於存儲變量:普通內存、運行時堆棧、硬件寄存器。變量的存儲類型決定了變量何時創建、何時銷毀以及它的值能保持多久,也就是決定了變量的生命周期。

* C語言根據變量的存儲類型的不同,可以把變量分為:自動變量、靜態變量、寄存器變量。

1.自動變量

1> 定義:自動變量是存儲在堆棧中的。

2> 哪些是自動變量:被關鍵字auto修飾的局部變量都是自動變量,但是極少使用這個關鍵字,基本上是廢的,因為所有的局部變量在默認情況下都是自動變量

3> 生命周期:在程序執行到聲明自動變量的代碼塊(函數)時,自動變量才被創建;當自動變量所在的代碼塊(函數)執行完畢后,這些自動變量就會自行銷毀。如果一個函數被重復調用,這些自動變量每次都會重新創建。

1 void test(int a, int b) {
2     int c = a + b;
3     
4     auto int d;
5 }

第1行的變量a、b,第2行的變量c、第4行的變量d都是自動變量。

 

2.靜態變量

1> 定義:靜態變量是存儲在靜態內存中的,也就是不屬於堆棧。

2> 哪些是靜態變量:

  • 所有的全局變量都是靜態變量
  • 被關鍵字static修飾的局部變量也是靜態變量

3> 生命周期:靜態變量在程序運行之前創建,在程序的整個運行期間始終存在,直到程序結束。

 1 #include <stdio.h>
 2 
 3 int a;
 4 
 5 void test() {
 6     static int b = 0;
 7     b++;
 8     
 9     int c = 0;
10     c++;
11     
12     printf("b=%d, c=%d \n", b, c);
13 }
14 
15 int main() {
16     int i;
17     // 連續調用3次test函數
18     for (i = 0; i<3; i++) {
19         test();
20     }
21     
22     return 0;
23 }

* 第3行的變量a、第6行的變量b都是靜態變量,第9行的變量c、第16行的變量i是自動變量。

* 因為第6行的變量b是靜態變量,所以它只會被創建一次,而且生命周期會延續到程序結束。因為它只會創建一次,所以第6行代碼只會執行一次,下次再調用test函數時,變量b的值不會被重新初始化為0。

* 注意:雖然第6行的變量b是靜態變量,但是只改變了它的存儲類型(即生命周期),並沒有改變它的作用域,變量b還是只能在test函數內部使用。

* 我們在main函數中重復調用test函數3次,輸出結果為:

 

3.寄存器變量

1> 定義:存儲在硬件寄存器中的變量,稱為寄存器變量。寄存器變量比存儲在內存中的變量訪問效率更高(默認情況下,自動變量和靜態變量都是放在內存中的)

2> 哪些變量是寄存器變量:

  • 被關鍵字register修飾的自動變量都是寄存器變量
  • 只有自動變量才可以是寄存器變量,全局變量和靜態局部變量不行
  • 寄存器變量只限 intchar指針類型變量使用

3> 生命周期:因為寄存器變量本身就是自動變量,所以函數中的寄存器變量在調用該函數時占用寄存器中存放的值,當函數結束時釋放寄存器,變量消失。

4> 使用注意:

  • 由於計算機中寄存器數目有限,不能使用太多的寄存器變量。如果寄存器使用飽和時,程序將寄存器變量自動轉換為自動變量處理
  • 為了提高運算速度,一般會將一些頻繁使用的自動變量定義為寄存器變量,這樣程序盡可能地為它分配寄存器存放,而不用內存
1 int main() {
2     register int a;
3     return 0;
4 }

第2行的變量a是個寄存器變量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM