動態存儲方式與靜態存儲方式;
變量的屬性作用域在空間的角度來分析,分爲局部變量和全局變量
變量還有一種屬性存儲期(生命期)
這個屬性可以分爲{
動態存儲期
靜態存儲期
}
這個分爲是由變量的靜態存儲方式和動態存儲方式決定的
存儲空間可以分爲三部分;
程序區
靜態存儲區
動態存儲區
全局變量放在靜態存儲區
程序開始時,分配存儲單元,結束時釋放空間
程序執行時他們佔據固定的存儲單元,不是動態分配的
動態存儲區放的是:函數形參,函數中的自動變量,函數調用時的現場保護和返回地址;
1、自動變量;
如果不是用static關鍵字加以聲明,編譯器會動態的分配存儲空間
在函數結束是會釋放這些空間
因此局部變量稱爲自動變量 自動變量用auto作存儲類別的聲明
默認都是自動變量
2、用static聲明靜態局部變量
在函數調用結束後不消失而保留原值,其佔用的存儲單元也不釋放
在下次調用時該變量保留上一次函數調用結束時的值
附上一個小例子:
#include <iostream>
using namespace std;
int f(int a)
{
auto int b = 0;
static int c = 3;
b = b+1;
c = c+1;
return a+b+c;
}
int main (int argc, const char * argv[])
{
int a = 2;
for(int i=0;i<5;i++)
cout<<f(a)<<"\n";
return 0;
}
3、用register聲明寄存器變量;
一般的變量都是存儲在內存中的,在程序需要的時候,就把變量從內存中讀取到運算器中,加入有個別的變量需要重複的用到,那麼在讀取內存變量的過程中就花費了大量的時間,所以可以通過register聲明寄存器變量在運算器中,以提高運算速度;
4、用extern聲明外部變量
全局變量(外部變量)
是在函數的外部定義的,作用域是從變量定義處開始到文件末尾。
但是如果你額外部變量不是在文件的開頭定義,那麼他的有效範圍只限於文件定義處到文件末尾;
estern int a, a 是一個已經在別處定義的變量;
5、用static聲明只限於本文件使用的外部變量
加入兩個文件中都有number變量
file1中用static定義
file2即使用了extern也不能引用file1中的number變量
綜上所述:
C++中允許四種存儲類別
auto //字符型自動變量,在函數內定義
static //靜態局部整形變量或靜態外部整形變量
register //整形寄存器變量,在函數內定義
extern //聲明一個已經定義的外部整形變量