全局變量即外部變量,如果前面再用static修飾就構(gòu)成了靜態(tài)的全局變量。
全局變量本身就是靜態(tài)存儲(chǔ)方式,靜態(tài)全局變量當(dāng)然也是靜態(tài)存儲(chǔ)方式,兩者存儲(chǔ)方式上并無(wú)區(qū)別;他們的區(qū)別在于非靜態(tài)全局變量的作用域是整個(gè)源程序,當(dāng)一個(gè)源程序由多個(gè)源文件組成時(shí),非靜態(tài)的全局變量在整個(gè)源文件中都是有效的。而靜態(tài)全局變量則限制了其作用域,即只在定義該變量的源文件內(nèi)有效,在同一源程序的其他文件不能使用他。由于靜態(tài)全局變量的作用域局限于一個(gè)源文件內(nèi),只能為該源文件內(nèi)的函數(shù)公用,因此可以避免在其他源文件中一起錯(cuò)誤。
如果把局部變量改為靜態(tài)變量后是改變的他的儲(chǔ)存方式和生命周期。把全局變量改為靜態(tài)變量后改變的是他的作用域,限制了他的使用范圍。
static全局變量與普通的全局變量有什么區(qū)別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝;
程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū) )中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于( 堆)中。
extern全局變量(用extern修飾的變量只是說(shuō)明該變量在其他地方定義,所以在其他地方一定要用明確的定義如int a,并且不能用static修飾)、static全局變量和static局部變量的生存期都是“永久”,區(qū)別只是可見(jiàn)域不同。extern全局變量可見(jiàn)區(qū)域是工程,static全局變量可見(jiàn)區(qū)域是文件,而static局部變量的可見(jiàn)區(qū)域是塊。
從代碼維護(hù)角度來(lái)看,對(duì)extern變量的修改可能會(huì)影響所有代碼,對(duì)static全局變量的修改可能影響一個(gè)文件中的代碼,而對(duì)static變量的修改可能影響一個(gè)塊的代碼;因此在選擇變量類型時(shí),優(yōu)先級(jí)是static局部>static全局>extern全局。但它們有著共同的缺點(diǎn):使用了這些類型變量的函數(shù)將是不可重入的,不是線程安全的。在C/C++標(biāo)準(zhǔn)庫(kù)中有很多函數(shù)都使用了static局部變量,目前的實(shí)現(xiàn)中都為它們提供了兩套代碼,單線程版本使用static變量而多線程版本使用“線程全局變量”,比如rand,strtok等。
一個(gè)進(jìn)程可用內(nèi)存空間為4G,可分在存放靜態(tài)數(shù)據(jù),代碼,系統(tǒng)內(nèi)存,堆,棧等。.活動(dòng)記錄一般存放調(diào)用參數(shù)、返回地址等內(nèi)容。堆和棧最大的區(qū)別在于堆是由低地址向高地址分配內(nèi)存,而棧是由高向低。全局和靜態(tài)數(shù)據(jù)存放在全局?jǐn)?shù)據(jù)區(qū),其余的在棧中,用malloc或new分配的內(nèi)存位于堆中。一般來(lái)說(shuō)棧在低地址,堆位于高地址。