作用域與鏈接

C語言編寫的源文件需要被編譯器編譯爲機器語言,然後與你調用的各種庫函數文件或同一項目的其他文件相鏈接形成exe可執行程序。

源文件之間的鏈接對於每個變量來講也是需要規定屬性的,稱爲連接屬性,分別爲:external,internal,none。

external(外部的):多個文件中聲明的同名標識符表示同一個實體。

internal(內部的):單個文件中聲明的同名標識符表示同一個實體。

none(無):聲明的同名標識符被當作獨立不同的個體。

註解:只有具備文件作用域的標識符才能擁有external或者internal的鏈接屬性,其他作用域的鏈接屬性都是none屬性。

默認情況下,具備文件作用域的標識符擁有external屬性。也就是說該標識符允許跨文件訪問。對於external屬性的標識符,無論在不同的文件中聲明多少次,表示的都是同一個實體。

static關鍵字:

使用static關鍵字可以使原想擁有的external屬性的標識符變爲internal屬性。這裏有兩點注意:

1,使用static關鍵字修改連接屬性,只對具有文件作用域的標識符生效(對於擁有其他作用域的標識符是另一種功能)。

2,鏈接屬性只能修改一次,也就是說將標識符的鏈接屬性變爲internal,就無法變回external了。

static靜態局部變量:

2.靜態局部變量存放在內存的全局數據區函數結束時,靜態局部變量不會消失,每次該函數調用時,也不會爲其重新分配空間。它始終駐留在全局數據區,直到程序運行結束。

3.靜態局部變量的初始化與全局變量類似.如果不爲其顯式初始化,自動初始化爲0。

4.靜態局部變量與全局變量共享全局數據區但靜態局部變量只在定義它的函數中可見

與普通局部變量的區別:

內存分配與釋放:靜態局部變量在編譯階段分配空間,程序結束階段釋放空間。局部變量只在執行作用域時分配內存,作用域執行結束時自動釋放內存。

初始化:未進行賦值操作的靜態局部變量被編譯器自動賦值爲0,局部變量內容隨機。

總結就是:多次執行static局部變量,變量不會被重複初始化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章