靜態(tài)局部變量又和靜態(tài)全局變量又有何區(qū)別?
static int x = 1; ? //定義靜態(tài)局部變量 ? ?x*=2; ? ?printf("x=%d\n",x); ? ? 靜態(tài)局部變量在編譯時賦初值,即只賦初值一次;-->靜態(tài)局部變量值可以變化嗎? 如果可以變化,那么靜態(tài)局部變量又和靜態(tài)全局變量又有何區(qū)別?
static int x = 1; ? //定義靜態(tài)局部變量 ? ?x*=2; ? ?printf("x=%d\n",x); ? ? 靜態(tài)局部變量在編譯時賦初值,即只賦初值一次;-->靜態(tài)局部變量值可以變化嗎? 如果可以變化,那么靜態(tài)局部變量又和靜態(tài)全局變量又有何區(qū)別?
2015-07-10
舉報
2015-07-11
首先:C語言中的名字(標(biāo)識符)具有很多屬性:生存期、可鏈接性...等
生存期分為:
靜態(tài)生存期:在程序開始前就已經(jīng)存在并初始化了,這個變量要的等整個程序都結(jié)束后才銷毀。
動態(tài)生存期:就是程序流程運行到這個位置時才為這個變量分配內(nèi)存,程序流程離開這個變量的作用域后就銷毀了它。
可鏈接性大致分為:
內(nèi)部鏈接:這個變量可以在代碼所在的文件中使用。
外部鏈接:這個變量在整個程序中(所有的文件中)都可以使用。
不可鏈接:這個變量只能在其代碼塊中被使用。常見的情況就是只能在其所在的函數(shù)中被使用。
static修飾符對于局部變量和全局變量的意義是不一樣的:
局部變量默認(rèn)具有 動態(tài)生存期 和 不可鏈接 的屬性。 局部變量是存在于函數(shù)中的,由于它具有動態(tài)生存期,故你每一次調(diào)用函數(shù),其中的這個變量都是全新的一個。你存儲于其中的值在函數(shù)調(diào)用結(jié)束后就不存在了,再次調(diào)用這個函數(shù)的得到的仍是全新一個變量。 但如果變量被static修飾,就成了靜態(tài)局部變量,“靜態(tài)”是指改變了其生存期,變成了靜態(tài)生存期,那么多次調(diào)用這個函數(shù)所訪問的就是同一個變量。這樣你存入其中的值在下一次函數(shù)調(diào)用時仍然存在。
全局變量默認(rèn)具有 靜態(tài)生存期 和 外部鏈接 屬性。 全局變量是存在于一個代碼文件中,并且是任何一個函數(shù)之外的。它在整個程序運行期間都存在,并且外部鏈接性保證它可以被本程序的其他文件中的代碼所使用。 而如果被static修飾,則鏈接性就變成內(nèi)部鏈接了,那這個變量就只能被本文件中的代碼使用了。對它來說static并不改變其生存期。
你提問中說的“靜態(tài)局部變量...只賦初值一次”說的就是你每一次調(diào)用函數(shù)其實都是用的同一個變量,而不是像普通局部變量一樣在每次調(diào)用時都重新生成,重新初始化。
所以明白了嗎:靜態(tài)局部變量的值當(dāng)然是可以變化的,而且它可以讓你在多次調(diào)用函數(shù)后保留存在其中的值。
“靜態(tài)”二字對于兩種變量來說都不影響其值是否可以被改變,變量的值能否被改變是由?const限定符 決定的。