c語言中變數分為四類,分別是
1.auto 自動變數
2.static 靜態存貯分配變數(又分為內部靜態和外部靜態)
3.extern 全程變數(用於外部變數說明)
4.register 寄存器變數(分配在硬體寄存器中)
四大類,所有變數必須先說明(定義),後使用。
下面分別介紹
1.自動變數(局部變數)
局部變數:在一個函數開頭或段開頭處說明的變數,它有幾個特徵,,
a、範圍為定義它的函數
b、編譯器不會對自動變數給予隱含的初值,故其值不確定,因此每次使用前必須明確的置初值。
c、形參是自動變數,範圍僅限於相應函數內
d、自動變數隨函數的引用而存在和消失,由一次調用到下一次調用之間不保持值。
#include <stdio.h>void print_number (int x, int y) { int m,sum; for(m = x;m<y;m++) { sum +=m; } printf("%d\n",sum);}void main(void) { print_number(3,5); print_number(3,5);}這個程式列印的值均不正確,因為sum未賦初值,造成了列印的數為隨機數。 我們把sum賦初值為0再執行以下,結果就正確了,這個程式說明局部變數必須要先賦初值再使用,另外說明局部變數的生命週期為函數調用時開始,函數調用完成時消亡。
2.外部變數:在函數外部定義的變數即為外部變數,它的範圍是整個程式(全程變數)。
a. c程式可以分別放在幾個檔案上,每個檔案可以作為一個編譯模組分別進行編譯。外部變數只需在某個檔案上定義一次,其它檔案若要引用此變數時,應用extern加以說明(外部變數定義時不必加extern關鍵字)。
b. 在同一檔案中,若前面的函數要引用後面定義的外部(在函數之外)變數時,在函數裡加extern加以說明。
引進外部變數的原因:解決函數單獨編譯的協調;與變數初始化有關;外部變數的值是永久的;解決資料共用; 注意:函數本身也被認為是外部變數
3.靜態變數:分為內部靜態變數和外部靜態變數
內部靜態變數:a.在局部變數前加上static就為內部靜態變數
b.靜態局部變數仍是局部變數,其範圍仍在定義它的函數範圍內,但它採用靜態存貯分配(由編譯器在編譯時間分配,而一般的自動變數和函數形參均採用動態存貯分配,即在運行時分配空間),當函數執行完,返回調用點時,該變數並不撤銷,再次調用時,其值將繼續存在。
外部靜態變數:a.在函數外部定義的變數前加static即為外部靜態變數
b.範圍為定義它的檔案,即成為該檔案的私人變數,其他檔案上的函數一律不得直接存取,除非通過它所在檔案上的函數進行操作,這可實現資料隱 藏。
4.寄存器變數:只有自動(局部)變數和函數參數才能進一步指定為寄存器存貯類
a.使用register變數可以提高存取速度,但寄存器變數的數目依賴於具體機器,聲明多了也只有前幾個有效。
b.只限於int,char,short ,unsigned和指標類型用寄存類。
c.不能對register變數取地址(即&操作)
變數的初始化:
外部變數和靜態變數由編譯器給予隱含的初始值0;
局部變數的初始化每進入函數便初始化一次。
外部或靜態變數僅在編譯時間初始化一次。
自動變數或寄存器變數只能顯示初始化,否則將有不確定的值。
外部資料的說明,如果帶有初始化項,則當成一個定義。
在c語言中函數不能嵌套定義,但是變數可以嵌套定義。
inti = 0;
main( )
{
inti = 1;
printf(“i=%d, ”, i);
{
inti = 2; printf(“i=%d, ”, i);
{
i += 1;
printf(“i=%d, ”, i); }
printf(“i=%d, ”, i);
}
printf(“i=%d\n ”, i);
}
結果:i=1, i=2, i=3, i=3, i=1