內容來源:C和指針(第二版),人民郵電出版社。
我太懶了,直接剪貼了書上的內容,講得比較詳細。書上用的c語言的版本是ANSI 90,有點過時了。
總結起來就是:
一、存儲類型
即指存儲變量值的內存類型,有普通內存、運行時堆棧、硬件寄存器。
默認存儲類型與變量聲明位置有關:像全局變量這樣代碼塊之外聲明的變量存儲在靜態內存中,不在堆棧裏,程序執行期間始終存在;代碼塊內聲明的變量默認存儲類型是自動的(automatic),稱爲自動(auto)變量,存儲在堆棧中,執行到代碼塊時被創建,代碼塊執行完即被銷燬。
注意!可以給自動變量加上關鍵字static,將它變爲靜態存儲類型,它就會在程序運行期間一直存在,但是它的作用域是不變的,代碼塊外面還是不能用這個變量。
//自動變量轉靜態變量之後作用域不變,舉個例子:
#include<stdio.h>
int main() {
int a=10;printf("%d\n",a);
{
static int b=9;
printf("%d\n",b);
}
//把下面這行註釋掉,就可以正常輸出10和9.
//不註釋就會報錯:[Error] 'b' was not declared in this scope.
//printf("%d\n",b);
return 0;
}
還有register存儲類型,內容自己看吧,主要注意不要給很多變量都添加register關鍵字的聲明,自己亂用register可能程序性能不升反降。
二、初始化
靜態變量不顯式初始化,會被自動初始化爲0。
自動變量不顯式初始化,裏面的將會是廢值。
但是如果自動變量顯式地初始化了,其效果就是在代碼塊的起始處插入一條隱式的賦值語句,其結果就是:①自動變量初始化了,和它在代碼塊裏給他賦值效率上沒什麼區別(聲明爲const的變量除外);②這條隱式的賦值語句在代碼塊每次使用時都會執行一次;③優點:可以用任何表達式爲自動變量賦值;④不顯式初始化得到的是廢值。