一、變量的三大特點:
變量的數據類型:主要說明變量佔用內存空間大小 如 int型。
變量的作用域:變量的有效性的範圍,即:變量的使用範圍。
變量的存儲類型:變量在內存中的存儲方式。不同的存儲方式,影響變量在內存中的生存週期。
二:變量的數據類型:
變量的數據類型有:int,float,double,char 等詳細請看其他資料。
三:變量的作用域:
1、局部變量:
1.1、定義:在一個函數內部或某個複合語句內部定義的變量稱爲局部變量。
1.2:特點:使用範圍是定義它的函數或複合語句。
1.2.1:局部變量被放在動態存儲區中,編譯時候系統不爲其分配存儲單元,在程序運行到局部變量所在的函數時才爲其分配內存單元。調用結束時,內存單元被釋放。即變量的生存期是函數的調用時間。
1.2.2:局部變量在不同的函數可以同名。只要作用域不同他們不會衝突。如果變量名相同,則當前局部變量優先。
2、全局變量:
2.1、定義:在所有函數外部(當然也在main函數外部)定義的變量稱爲全局變量。
2.2、特點:全局變量的作用域從定義變量的位置開始到源程序結束,並且默認初始值爲0。
2.2、全局變量存放在靜態存儲區中,在編譯時給全局變量分配內存單元,直到程序運行結束變量才被釋放。全局變量的生存期爲整個程序運行期間。
2.3、若全局變量與局部變量同名局部變量在定義它的函數內優先。
2.4、如果要在定義之前使用局部變量,用extern加以聲明可擴展全局變量的作用域。
四、變量的存儲方式:
1. 變量的存儲方式共有兩種:靜態存儲和動態存儲。
2. 變量的存儲方式由變量的作用域和變量的存儲類型共同決定、能僅從作用域上判斷。
C存儲類型共有四種:
1、 auto:自動變量 (編譯器默認類型,簡稱系統默認)
2、 register:寄存器變量
3、 static:靜態類型
4、 extern:外部類型
auto類型詳解:
如果未加類型存儲類型說明默認爲 auto類型
1.例子:int a=4; <=> auto int a=4; (<=>等價符號)。
2.形參變量屬於自動變量。
3.自動變量屬於局部變量。
register 類型詳解:
寄存器類型跟普通類型區別:寄存器類型變量存放在CPU的寄存器中,速度比存放在內存中的變量操作速度快。一般將反覆多次使用的變量放到寄存器中,以提高程序的運行速度。
static 類型變量
一、 靜態類型變量屬於靜態存儲方式。屬於靜態存儲方式的不一定是靜態類型變量。如外部變量。
二、 靜態變量分爲兩種:靜態局部變量和靜態全局變量。
1:靜態局部變量:在局部變量前加上存儲類型說明符
static 就構成了靜態局部變量。
1.1:靜態局部變量與局部變量的區別:
1.1.1靜態局部屬於靜態存儲方式,局部變量屬於動態存儲方式。
1.1.2:定義域相同,僅限與定義他的函數,當函數調用結束後自動類型變量的值消失,而靜態局部變量的值會一直在內存中,只是外部不能調用。當再次調用這個函數,靜態變量的值繼續有效並且等於上次調用結束的值。
例如:
Void TestStatic ()
{
static int i=0;
i ;
printf(“%d”,i);
}
Main()
{
TestStatic () //結果是打印出 數字 1
TestStatic ()// 第二次調用結果打印出 2
//靜態變量的第二次調用 不執行 static int i=0; 這一句。
}
1.1.3 生存期的區別:靜態局部變量的生存期是整個程序運行期間,動態局部變量的生存期是函數調用結束。
1.1.4、系統自動爲靜態局部變量賦初始值 0,而自動變量的初值不確定。
靜態全局變量
2:靜態全局變量:
在全局變量前加上存儲類型說明 static 就構成了靜態全局變量。
2.1、靜態全局變量與全局變量的區別:全局變量的作用域是整個程序。而靜態變量的作用域是定義該變量的源文件。
總結:static 作用於局部變量改變了 局部變量的生存期。作用域全局變量改變了全局變量的使用範圍。
Extern 類型變量詳解:
一、 extern類型定義:
外部類型是定義在所有函數之外的全局變量、在編譯時候系統分配給其永久的存儲空間
二、 特點:
1. 外部變量與靜態變量一樣,系統自動爲未初始化的的變量賦予0值。
2. 外部變量與全局變量一樣,作用域爲從定義到整個源程序結束
3. 外部變量可以被其他文件使用,如只限定在本文件使用加static限定符。
例如: 有文件 a.c和文件b.c 在b.c中定義外部變量 int cctwl=520;
a.c 文件內容如下:
main()
{
Extern int cctwl;//聲明外部變量,編譯器會自動找到 b.c中的 變量cctwl。
Printf(“%d”,cctwl);//結果520。
}
外部變量調用前 必須用 extern聲明 而外部函數的聲明可以省略 extern 直接寫出函數原型就可。系統默認加上 extern。