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