黑馬程序員匠心之作|C++教程從0到1入門編程,學(xué)習(xí)編程不再難

剛剛好奇去查了,轉(zhuǎn)自CSDN的zzhays
靜態(tài)全局變量和全局變量
之間的區(qū)別,表面上看都是作用在整個(gè)文檔,而且任何一個(gè)地方改變都會(huì)影響其值的改變。但是細(xì)分就會(huì)發(fā)現(xiàn)其區(qū)別:
//Example 1
#include <iostream.h>
void fn();
static int n; //定義靜態(tài)全局變量
void main()
{
???n=20; cout<<n<<endl; fn();
}
void fn() { n++; cout<<n<<endl; }
靜態(tài)全局變量有以下特點(diǎn): 該變量在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存;未經(jīng)初始化的靜態(tài)全局變量會(huì)被程序自動(dòng)初始化為0(在函數(shù)體內(nèi)聲明的自動(dòng)變量的值是隨機(jī)的,除非它被顯式初始化,而在函數(shù)體外被聲明的自動(dòng)變量也會(huì)被初始化為0); 靜態(tài)全局變量在聲明它的整個(gè)文件都是可見的,而在文件之外是不可見的; 靜態(tài)變量都在全局?jǐn)?shù)據(jù)區(qū)分配內(nèi)存,包括后面將要提到的靜態(tài)局部變量。對(duì)于一個(gè)完整的程序,在內(nèi)存中的分布情況如下圖:
代碼區(qū) //low address
全局?jǐn)?shù)據(jù)區(qū)
堆區(qū)
棧區(qū) //high address
一般程序把新產(chǎn)生的動(dòng)態(tài)數(shù)據(jù)存放在堆區(qū),函數(shù)內(nèi)部的自動(dòng)變量存放在棧區(qū)。自動(dòng)變量一般會(huì)隨著函數(shù)的退出而釋放空間,靜態(tài)數(shù)據(jù)(即使是函數(shù)內(nèi)部的靜 態(tài)局部變量)也存放在全局?jǐn)?shù)據(jù)區(qū)。全局?jǐn)?shù)據(jù)區(qū)的數(shù)據(jù)并不會(huì)因?yàn)楹瘮?shù)的退出而釋放空間。細(xì)心的讀者可能會(huì)發(fā)現(xiàn),Example 1中的代碼中將 static int n; //定義靜態(tài)全局變量 改為 int n; //定義全局變量 程序照樣正常運(yùn)行。 的確,定義全局變量就可以實(shí)現(xiàn)變量在文件中的共享,但定義靜態(tài)全局變量還有以下好處: 靜態(tài)全局變量不能被其它文件所用; 其它文件中可以定義相同名字的變量,不會(huì)發(fā)生沖突; 您可以將上述示例代碼改為如下:
//Example 2 //File1
#include <iostream.h>
void fn();
static int n; //定義靜態(tài)全局變量
void main()
{ n=20; cout<<n<<endl; fn(); }
//File2
#include <iostream.h>
extern int n;
void fn()
{ n++; cout<<n<<endl; }
編譯并運(yùn)行Example 2,您就會(huì)發(fā)現(xiàn)上述代碼可以分別通過編譯,但運(yùn)行時(shí)出現(xiàn)錯(cuò)誤。
試著將 static int n; //定義靜態(tài)全局變量 改為 int n;
//定義全局變量 再次編譯運(yùn)行程序,
細(xì)心體會(huì)全局變量和靜態(tài)全局變量的區(qū)別。
注意:全局變量和全局靜態(tài)變量的區(qū)別
1)全局變量是不顯式用static修飾的全局變量,但全局變量默認(rèn)是動(dòng)態(tài)的,作用域是整個(gè)工程,在一個(gè)文件內(nèi)定義的全局變量,在另一個(gè)文件中,通過extern 全局變量名的聲明,就可以使用全局變量。
2)全局靜態(tài)變量是顯式用static修飾的全局變量,作用域是聲明此變量所在的文件,其他的文件即使用extern聲明也不能使用。
3)文件作用域下聲明的const的常量默認(rèn)為static存儲(chǔ)類型。
————————————————
版權(quán)聲明:本文為CSDN博主「zzhays」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。