C語言auto、static、register等變量區別

局部變量、全局變量和存儲分類

在函數內部或複合語句內定義的變量,稱爲局部變量。函數的形參也屬於局部變量。在函數外部定義的變量稱爲全局變量。
C語言中,有兩種存儲內別:一種是自動類,一種是靜態類。局部變量既可以說明成自動類,而全局變量只能是靜態類。
有四個與兩種存儲類別有關的說明符,它們是auto(自動)、register(寄存器)、static(靜態)和extern(外部)。這些說明符通常與類型名一起出現,它們可以放在類型名的左邊,也可以放在類型名的右邊,例如:
auto int i,j; 也可以寫成int auto i,j;
通過存儲類別我們也就可以看出對象在內存中的存儲位置,從而也就確定了所說明對象的作用域和生存期。
動態存儲區用來保存函數調用時的返回地址、自動類別的局部變量等。靜態存儲區用以存放全局變量及靜態類別的局部變量。

auto變量

當在函數內部或複合語句內定義變量時,如果沒有指定存儲類,或使用了auto說明符,系統就認爲所定義的變量具有自動類別。因此,
float a;
就等價於
auto float a;
auto變量的存儲單元被分配在內存的動態存儲區。每當進入函數體(或複合語句)時,系統自動爲auto變量分配存儲單元;退出時自動釋放這些存儲單元另作它用。因此,這類局部變量的作用域是從定義的位置起,到函數體(或複合語句)結束爲止。

register變量

寄存器變量也是自動類變量,它與auto變量的區別僅在於:用register說明的變量建議編譯程序將變量的值保存在CPU的寄存器中,而不是像一般變量那樣佔內存。程序運行時,訪問寄存器內的值要比訪問存於內存的值快得多。然CPU寄存器的數目是有限的,因而儘量說明少量的寄存器變量且用完即釋放。

靜態存儲類的局部變量

當在函數體(或複合語句)內部用static來說明一個變量時,可以稱該變量爲靜態局部變量。靜態局部變量的作用域仍與auto、register類變量一樣,但它與兩者有本質上的區別:
(1)在整個程序運行期間,靜態局部變量在內存的靜態存儲區中佔據着永久性的存儲單元。即使退出函數以後,下次再進入該函數時,靜態局部變量仍然使用原來的存儲單元。由於並不釋放這些存儲單元,因此這些存儲單元中的值得以保留,因而可以繼續使用存儲單元中原來的值。由此可知,靜態局部變量的生存期將一直延長到程序運行結束。
(2)靜態局部變量的初值是在編譯時賦予的,不是在程序執行期間賦予(自動變量是在程序執行過程中賦初值)。對未賦初值的靜態局部變量,C編譯程序自動給它賦初值0.
靜態局部變量上述特點,對於編寫那些在函數調用之間必須保留局部變量值的獨立函數是非常有用的。

extern

習題

1.#include<stdio.h>
void sub(int*,int*);
main()
{int a[]={1,2,3,4},i,x=0;
for(i=0;i<4;i++){sub(a,&x);printf("%d",x);}
printf("\n");
}
void sub(ints,inty)
{static int t=3;
y=s[t];t–;
}
分析:把數組a的首地址,變量x的地址傳給指針變量s,t。
y=s[3]=4,t-1,t的值變爲2,y的值返回到主函數中,因爲t是static定義的變量,所以再進入函數時,y=s[2]=3…以此類推得到輸出結果是4,3,2,1。
2.#include<stdio.h>
void fun(int
s)
{static int j=0;
do s[j]+=s[j+1];while(++j<2);
}
main()
{int k,a[10]={1,2,3,4,5};
for(k=1;k<3;k++)fun(a);
for(k=0;k<5;k++)printf("%d",a[k]);
}
分析:for(k=1;k<3;k++)總共進行了兩次循環,第一次循環得到a[0]=3,a[1]=5;第二次循環得到a[2]=7,則a[10]={3,5,7,4,5},輸出結果自然便是35745。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章