本文目錄
- [?一、變量的作用域](http://www.cnblogs.com/mjios/archive/2013/03/21/2973719.html#label0)
- [二、變量的存儲類型](http://www.cnblogs.com/mjios/archive/2013/03/21/2973719.html#label1)
說明:這個C語言專題,是學習iOS開發的前奏。也為了讓有面向對象語言開發經驗的程序員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略
C語言有豐富的數據類型和運算符,因此計算能力非常強大,計算過程中使用的值一般用變量來存儲。變量也是有分類型的,不同類型的變量有不同的存儲類型、不同的生命周期、不同的作用域,C語言也提供了一些關鍵字來設置變量的屬性(比如設置存儲類型、生命周期)。
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/21/2973719.html#labelTop)
### ?一、變量的作用域
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是局部變量。
[回到頂部](http://www.cnblogs.com/mjios/archive/2013/03/21/2973719.html#labelTop)
### 二、變量的存儲類型
* 變量的存儲類型就是指變量存儲在什么地方。有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修飾的自動變量都是寄存器變量
- 只有自動變量才可以是寄存器變量,全局變量和靜態局部變量不行
-
寄存器變量只限于int、char和指針類型變量使用
3> 生命周期:因為寄存器變量本身就是自動變量,所以函數中的寄存器變量在調用該函數時占用寄存器中存放的值,當函數結束時釋放寄存器,變量消失。
4> 使用注意:
- 由于計算機中寄存器數目有限,不能使用太多的寄存器變量。如果寄存器使用飽和時,程序將寄存器變量自動轉換為自動變量處理
- 為了提高運算速度,一般會將一些頻繁使用的自動變量定義為寄存器變量,這樣程序盡可能地為它分配寄存器存放,而不用內存
~~~
1 int main() {
2 register int a;
3 return 0;
4 }
~~~
第2行的變量a是個寄存器變量。
- 前言
- C語言入門教程1-概述
- C語言入門教程2-第一個C程序
- C語言入門教程3-關鍵字、標識符、注釋
- C語言入門教程4-變量與常量
- C語言入門教程5-進制
- C語言入門教程6-變量與內存
- C語言入門教程7-基本數據類型
- C語言入門教程8-運算符
- C語言入門教程9-流程控制
- C語言入門教程10-函數
- C語言入門教程11-函數的聲明定義
- C語言入門教程12-scanf與printf輸入輸出函數
- C語言入門教程13-數組-批量數據存儲
- C語言入門教程14-字符串
- C語言入門教程15-字符與字符串常用處理函數
- C語言入門教程16-指針
- C語言入門教程17-指向一維數組元素的指針
- C語言入門教程18-指針與字符串
- C語言入門教程19-預處理指令1-宏定義
- C語言入門教程20-預處理指令2-條件編譯
- C語言入門教程21-預處理指令3-文件包含
- C語言入門教程22-變量類型與作用域
- C語言入門教程23-枚舉
- C語言入門教程24-結構體
- C語言入門教程25-typedef類型別名