本文整理于多個(gè)博客如https://blog.csdn.net/weixin_43222324/article/details/106989714
首先,對(duì)比這些變量的不同,最重要的是兩個(gè)方面,一個(gè)是作用域一個(gè)是生命周期。
靜態(tài)變量和動(dòng)態(tài)變量對(duì)比
靜態(tài)變量和動(dòng)態(tài)變量(自動(dòng)變量)---是從變量的內(nèi)存分配的角度(生命周期)劃分。
- 靜態(tài)變量:
- 存在靜態(tài)存儲(chǔ)區(qū),分配一次空間,在程序的整個(gè)運(yùn)行期間內(nèi)都不釋放空間。
- 編譯時(shí)賦初始值,只賦一次初值,在以后每次調(diào)用函數(shù)時(shí),都不再重新為其賦值,只是使用上一次函數(shù)被調(diào)用結(jié)束時(shí)變量的值。
- 未賦初值的話,編譯器給賦值為0.
- 動(dòng)態(tài)變量(自動(dòng)變量):
- 存在動(dòng)態(tài)存儲(chǔ)區(qū)(棧)上,即局部變量,函數(shù)調(diào)用結(jié)束后存儲(chǔ)單元即被釋放。
- 而自動(dòng)局部變量的初值不是在編譯時(shí)賦予的,而是在函數(shù)調(diào)用時(shí)賦予的,每調(diào)用一次,函數(shù)都對(duì)變量重新賦一次初值。
- 如果不賦值,則變量的值是一個(gè)不確定的值。
全局變量和局部變量對(duì)比
全局變量和局部變量---是從變量的作用域的角度劃分。
-
全局變量(外部變量):
- 作用域?yàn)檎麄€(gè)工程
- 存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)(這點(diǎn)與靜態(tài)變量相同)
- 此處引入外部變量(extern關(guān)鍵字):extern主要針對(duì)具有多個(gè)源文件的項(xiàng)目。如果有多個(gè)源文件需要使用到相同的全局變量,則這些變量只需要在其中的某一個(gè)源文件中定義一次,其它的源文件如果想使用這些外部變量,需要在聲明的時(shí)候前面加上"extern"。
-
局部變量:
- 作用域?yàn)楫?dāng)前程序塊
- 存儲(chǔ)在棧區(qū)(非靜態(tài)局部變量就是自動(dòng)變量)
優(yōu)先使用局部變量再使用全局變量:局部變量可以與全局變量重名,但是局部變量會(huì)屏蔽全局變量。
靜態(tài)局部變量和靜態(tài)全局變量
靜態(tài)全局變量
把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。并不是說全局變量在定義時(shí)加了static關(guān)鍵字才是靜態(tài)存儲(chǔ),不加static就是動(dòng)態(tài)存儲(chǔ),不是的。不管加不加static,全局變量都是存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)的,都是在編譯時(shí)分配存儲(chǔ)空間的,兩者只是作用域不同,全局變量默認(rèn)具有外部鏈接性,作用域是整個(gè)工程,全局靜態(tài)變量的作用域僅限本文件,不能在其他文件中引用。靜態(tài)局部變量
把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。但是作用域還是在原來的函數(shù)體內(nèi)可以使用
總結(jié):把局部變量改變?yōu)殪o態(tài)變量后是改變了它的存儲(chǔ)方式即改變了它的生存期。把全局變量改變?yōu)殪o態(tài)變量后是改變了它的作用域,限制了它的使用范圍。
最后總結(jié)一個(gè)表格
