1. 程式人生 > >靜態變數static和extern外引用

靜態變數static和extern外引用

靜態變數--加static關鍵字的變數,特點:

(1)在全域性資料區中分配記憶體,每次對其值得修改都會保留結果,直至程式結束。

(2)若靜態變數沒顯示初始化,那會被自動初始化為0,並且只能初始化一遍。

1、全域性變數:

在全域性資料區中分配記憶體,每次值得修改都會保留結果。有全域性作用域,並且有外部連結性,也就是不僅是所在檔案,工程內的其他檔案也可以用extern來使用同個工程內其他檔案裡面定義的變數。例如下面的例子:

程式碼1:

#include <iostream>
using namespace std;

static int a = 10;
int b = 6;

程式碼2:
#include <iostream>
using namespace std;

int main()
{
	extern int b;
	cout << b << endl;
	return 0;
}

程式碼1和2是在同一個工程的,然後對工程進行編譯執行,得到輸出結果為6:


說明在程式碼1定義的全域性變數:int b = 6;在程式碼2中通過關鍵字extern使用:extern int b; 然後在程式碼2中就能使用b=6的值了。也就是extern關鍵字表明:此變數/函式是在別處定義的,要在此處引用。

2、靜態全域性變數:

與全域性變數相比也具有全域性作用域特性以及全域性資料區中分配記憶體特性。

全域性變數和全域性靜態變數的區別:
a)全域性變數是不顯式用static修飾的全域性變數,全域性變數預設是有外部連結性的,作用域是整個工程,在一個檔案內定義的全域性變數,在另一個檔案中,通過extern 全域性變數名的宣告,就可以使用全域性變數。
b)全域性靜態變數是顯式用static修飾的全域性變數,作用域是宣告此變數所在的檔案,其他的檔案即使用extern宣告也不能使用

3、靜態區域性變數:

使用價值:需要再兩次函式呼叫之間對變數的值進行儲存時。

特點:

(1)(2)繼承上面靜態變數的特點,即全域性資料區分配記憶體+只在第一遍執行宣告時進行初始化。

(3)同時有區域性變數的特點,也就是隻能為所在函式所使用(作用域為區域性)。

示例程式碼:

#include <iostream>
using namespace std;

static int a = 10;
int b = 6;

void p()
{
	static int count = 1;
	count++;
	cout << "count "<<count << endl;
	a++;
	b++;
	cout << "a "<<a <<" b "<<b<< endl;
}

int main()
{
	a++;
	cout << "a "<<a << endl;
	p();
	p();

	return 0;
}