全局變量、static 全局變量、局部變量、static 局部變量的理解(帶實例)

全局變量、static 全局變量、局部變量的理解(帶實例)

全局變量

在所有函數外部定義的變量稱爲全局變量(Global Variable),它的作用域默認是整個程序,也就是所有的源文件,包括 .c 、.cpp、.h 文件。當一個cpp文件需要使用另一個cpp文件定義的全局變量,通過用extern聲明,就可以從“聲明”處起,合法地使用全局變量
全局變量全部存儲在靜態存儲區。在程序開始執行過程中給全局變量分配空間,程序執行完畢就釋放空間。程序執行過程中固定的分配空間,而不需要動態進行分配是釋放。

static全局變量

全局變量前加static的作用是現在全局變量的作用範圍,使該全局變量只在定義全局變量的源cpp文件中有效,其他源文件不能通過extern聲明使用。

局部變量

定義在函數體、塊作用域、內部的變量,作用域僅限於函數體內部、塊作用域裏,離開函數體、塊作用域就會無效。局部變量與全局變量同名時,在該函數體內、塊作用域裏只會使用局部變量,自動隱藏全局變量。
程序在運行期間爲局部變量動態地分配存儲空間

static局部變量

靜態局部變量屬於靜態存儲類別,在靜態存儲區內分配存儲單元,在編譯時賦初值,即只賦初值一次。在程序整個運行期間都不釋放

代碼

extern_1.h:

static int st1 = 0;//所有包含h的頭文件可以被其他文件通過extern引用

extern_1.cpp:

#include<stdio.h>
#include"extern_1.h"

int test = 1;//全局變量,可以被其他.c、.cpp、.h文件通過extern引用

static int st2 = 0;//不!!可以被其他文件通過extern引用,static修\
				   飾的全局變量只在該extern_1.cpp文件有效,其他文件無效。

extern_2.cpp:

extern int test;

int test_static()
{
	return test + 1;
}

main.cpp:

#include<stdio.h>
#include"extern_1.h"
#include<Windows.h>

extern int test;

//s1已經自然包含,因s1是定義在頭文件中,通過#include"extern_1.h"已經包含

//extern int st2;

int f(void);

int main(int argc, char const *argv[])
{
	//例1------------
	//int test = 100;//新定義了一個局部變量,與全局變量同名,main函數裏將覆蓋全局變量,但是test並沒作爲參數傳給f(),所以f()訪問的還是全局變量
	//printf("local test=%d\n", test);//

	////例2------------
	test = 100;//更改全局變量的值
	printf("local test=%d\n", test);//

	f();
	f();
	f();
	system("pause");
}

int f(void)
{
	static int all = 1;//static 局部變量
	printf("all=%d\n", all);
	all += 2;
	printf("agn all=%d\n", all);

	test++;//全局變量
	printf("internal test=%d\n", test);

	st1++;//s1爲static全局變量,已經自然包含,因s1是定義在頭文件中,通過#include"extern_1.h"已經包含
	printf("static int st1=%d\n", st1);

	return all;
}

輸出結果

main函數裏給了2個例子,註釋掉例2,運行例1,結果輸出如下:
在這裏插入圖片描述
main函數裏註釋掉例1,運行例2,結果輸出如下:
在這裏插入圖片描述
注意,main函數裏局部變量test與全局變量同名的輸出有差異,static int st2在extern_2.cpp中不可見

參考

https://blog.csdn.net/u013355826/article/details/53224303/

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