全域性變數

six*。發表於2020-11-05

一、全域性變數

全域性變數的初始化

1.沒有做初始化的全域性變數會得到0值
2.指標會得到NULL值
3.只能用編譯時刻已知的值來初始化全域性變數
4.它們的初始化發生在main函式之前

全域性變數的隱藏

如果在某個函式中定義了和全域性變數同名的變數,那麼全域性變數將被隱藏
小範圍的本地變數將隱藏大範圍的全域性變數

二、靜態本地變數

即:能在函式結束後繼續保留本值的本地變數

#include<stdio.h>
int gall=12;//全域性變數
int f(void);
int main()
{
	f();
	f();
	f();
	return 0;
}
int f(void)
{
	int all=1;
	printf("in _f_ all=%d\n",all);
	all+=2;
	printf("agn in _f_ all=%d\n",all);
	return all;
}

那如果用static 會是什麼樣的結果呢

#include<stdio.h>
int gall=12;//全域性變數
int f(void);
int main()
{
	f();
	f();
	f();
	return 0;
}
int f(void)
{
	int static all=1;
	printf("in _f_ all=%d\n",all);
	all+=2;
	printf("agn in _f_ all=%d\n",all);
	return all;
}

在這裡插入圖片描述
通過這兩個程式執行結果的差別就能知道static的作用了。

#include<stdio.h>
int gall=12;//全域性變數
int main()
{
	int k=0;
	static int all=1;//靜態本地變數
	printf("&gall=%p\n",&gall);
	printf("&all =%p\n",&all);
	printf("&k   =%p\n",&k);
	return 0;
}

在這裡插入圖片描述
我們可以看到 gall和all在記憶體中是挨著存放的。而本地變數k則跟他們不在一塊
所以我們可以知道
1.靜態本地變數實際上是特殊的全域性變數
2.他們位於相同的記憶體區域。
3.靜態本地變數具有全域性的生存期,函式內的區域性作用域。
4.static在這裡的意思是區域性作用域(本地可訪問)

相關文章