全局變量、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/