① 靜態變數有何特點如何存取靜態變數
靜態變數的類型說明符是static。靜態變數當然是屬於靜態存儲方式,但是屬於靜態存儲方式的量不一定就是靜態變數,例如外部變數雖屬於靜態存儲方式,但不一定是靜態變數,必須由static加以定義後才能成為靜態外部變數,或稱靜態全局變數。
對於自動變數,它屬於動態存儲方式。但是也可以用static定義它為靜態自動變數,或稱靜態局部變數,從而成為靜態存儲方式。由此看來,一個變數可由static進行再說明,並改變其原有的存儲方式。
常量使用
靜態變數也可以用於存儲常數。具體來說,靜態變數(全局變數及匯編語言里定義的符號亦同)可用const,constant或final(根據語言決定)等關鍵字標識,這時其值就會在編譯時設定,並且無法在運行時改變。
編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區;而如若有需要,有些編譯器還可選擇為其開辟專用區;為防止常數變數被錯誤的指針寫入覆蓋,亦可在這塊區域啟用內存保護機制。
以上內容參考:網路-靜態變數
② 變數的靜態存儲與動態存儲
首先,靜態存儲與動態存儲都是變數在內存中的存儲方式。
c語言中變數分為局部變數(auto)、寄存器變數(register)、全局褲如變數(extern)、靜態變數(static)。局部變數和寄存器變數在內存中以動態存儲的方式存儲,外部變數和靜態變數在內存中以靜態存儲的方式存儲。(筆者註:C語言不存在真正意義上的「全局變數」。被習埋純搜慣性誤稱為「全局變數」的,一般是文件作用域對象。參考: 全局變數-維基網路 )
靜態存儲的變數存儲在內存的靜態區,在整個程序的生命周期內不被釋放。動態存儲的變數在程序執行的過程中才分配存儲位置,使用完成後便被釋放。
靜態存儲的變數如果在聲明後沒有被初始化,則系統會根據數據類型自動將其初始化為「0」或『\0』。動態存儲的變數如果在聲明後沒有被初始化,那麼它的值是彎歷不確定的。
③ c/c++(2)
1、全局靜態變數、局部靜態變數
2、靜態函數。只能在 本源文件 中使用
3、c++中,static關鍵字可以定義 類 中的靜態成員變數。類中static靜態數據成員擁有一塊獨立的單獨存儲區,而不管創建了多少個該類的對象。這些對象共享這一塊靜態存儲區。
4、c++中,static關鍵字可以定義 類 中的靜態成員函數。靜態成員函數也是類的一部分,而不是對象的一部分。這些對象共享這一塊靜態存儲區
1、數組是用來存儲多個相同類型的集合。數組名是首元素的地址。
2、指針相當一個變數,它存放的是其他變數在內存中地址。指針名只想內存的首地址。
區別:
1、賦值
2、存儲方式:
數組:連續存放、連續內存。不是在靜態區就是在棧上。
指針:靈活、內存空間不確定。
3、初始化
4、指針操作
數組名的指針操作:
定義:指向函數的指針。
應用:回調
c語言:全局或者靜態變數,初始化發生在任何代碼執行之前,屬於編譯期初始化。
c++:全局或者靜態對象當且僅當對象首次用到時才進行構造。
解析:
作用域 :C++里作用域可分為6種: 全局 , 局部 , 類,語句 , 命名空間 和 文件作用域 。
靜態全局變數 :全局作用域+文件作用域,所以無法在其他文件中使用。
靜態局部變數 :局部作用域,只被初始化一次,直到程序結束。
靜態局部變數 :局部作用域,只被初始化一次,直到程序結束
生命周期 :靜態全局變數、靜態局部變數都在靜態存儲區,直到程序結束才會回收內存。類靜態成員變數在靜態存儲區,當超出類作用域時回收內存。
答:能。
原因: 因為在 編譯時對象 就綁定了 函數地址 ,和指針空不空沒關系。
定義 : 野指針就是指針指向的位置是不可知的(隨機的、不正確的、沒有明確限制的)
產生原因 : 釋放內存後指針不及時置空(野指針),依然指向了該內存,那麼可能出現非法訪問的錯誤。這些我們都要注意避免。
避免辦法:
1、初始化置為NULL;
2、申請內存判空;
3、指針釋放後置空;
4、使用智能指針;
1、首先從作用域考慮 :C++里作用域可分為6種: 全局 , 局部 , 類 , 語句 , 命名空間 和 文件 作用域。
全局變數 :全局作用域,可以通過 extern 作用於其他非 定義的源文件
靜態全局變數 :全局作用域+文件作用域,所以 無法在其他 文件中使用。
局部變數 :局部作用域,比如函數的參數,函數內的局部變數等等。
靜態局部變數 :局部作用域,只被 初始化一次,直到程序結束
2、從所在空間考慮 :除了 局部變數在棧上 外,其他都在靜態存儲區。因為靜態變數都在靜態存儲區,所以下次調用函數的時候還是能取到原來的值。
3、生命周期 : 局部變數在棧上,出了作用域就回收內存 ;而全局變數、靜態全局變數、靜態局部變數都在靜 態存儲區,直到程序結束才會回收內存。
區別:
1、宏不是函數 ,省去壓棧退棧過程,提高效率。 內聯函數本質是一個函數 , 並且內聯函數本身不能直接調用自身。
2、 宏函數 是在預編譯的時候把所有的宏名用宏體來替換,簡單的說就是字元串替換。 而內聯函數 則是在編譯的時候進行代碼插入,編譯器會在每處調用內聯函數的地方直接把內聯函數的內容展開,這樣可以省去函數的調用的開銷,提高效率。
3、 宏定義 是沒有類型檢查的,無論對還是錯都是直接替換; 而內聯函數 在編譯的時候會進行類型的檢查,內聯函數滿足函數的性質,比如有返回值、參數列表等。
1、賦值順序不同 :++ i 是先加後賦值;i ++ 是先賦值後加;++i和i++都是分兩步完成的。
2、效率不同 :後置++執行速度比前置的慢
3、 i++ 不能作為左值,而++i 可以
4、 兩者都不是原子操作