在c語言中static既可以修飾變數也可以修飾函式。static修飾變數又分為修飾區域性變數和修飾全域性變數。static修飾函式改變的是函式的鏈結屬性。
一、static修飾區域性變數,改變變數的生命週期,作用域不發生變化。
區域性變數定義在函式內部,在呼叫函式時給變數分配棧空間,函式呼叫結束,釋放該變數空間。但是加上static修飾稱為靜態區域性變數。如果我們希望函式呼叫結束之後,區域性變數的值不會消失,而是保留上一次函式呼叫結束時的值,即變數占用的空間不被釋放。在下一次呼叫該函式是,改變了的值就是上一次呼叫結束時候的值,就可以宣告為靜態區域性變數。
(1)靜態區域性變數在靜態儲存區(資料段)內分配儲存單元。在程式整個執行期間都不會釋放。而自動變數(動態區域性變數)屬於動態儲存方式(棧),函式呼叫結束之後就釋放。
(2)靜態區域性變數是在編譯期間賦初值,即只賦一次,在程式執行時,他已經有了初值。以後每次呼叫函式時,不在對該變數重新賦值。而自動變數是在函式呼叫時賦初值,每呼叫一次賦初值一次。
(3)如果在定義區域性變數不初始化,靜態區域性變數會預設初值為0,而自動變數為隨機值。
(4)函式呼叫結束後,靜態區域性變數不釋放,但是其他函式不可以使用該區域性變數。
二、static修飾全域性變數,作用域僅限於本檔案,其他檔案使用extern也不可以。
靜態全域性變數:作用域僅限於變數被定義的檔案中,其他檔案即使使用extern也沒有辦法使用它。準確的說作用域是從定義之處開始,帶檔案結尾處結束,在定義之處前面的那些**也不可以使用它,如果想要使用必須加extern宣告。
全域性變數(未加static)和靜態全域性變數都儲存於資料段。
三、static修飾函式,改變鏈結屬性
注:以上只要具有外部鏈結屬性就可以使用extern修飾宣告在其他檔案內使用,除非加上static限制了鏈結屬性。
c++中相容了c語言的static。除此之外增加了(靜態成員)static修飾類的靜態成員變數和靜態成員函式。類的靜態成員一定要在類外初始化。
(1)靜態成員是所以類物件共享,不是屬於某乙個物件。sizeof可以驗證。
(2)靜態成員變數必須要在類外定義,定義時不加static關鍵字。
(3)靜態成員可以使用類名::靜態成員或者物件.靜態成員(這種方式底層還是第一種)來訪問。
(4)靜態成員函式沒有this指標,所以在靜態成員函式內部不可以呼叫非靜態成員變數,並且不可以使用const修飾。
(5)靜態成員和普通成員一樣具有訪問許可權。
class date
static void display()
private:
int _year;
int _month;
int _day;
static int _count;
};int date::_count = 0;
int main()
靜態成員函式不可以呼叫非靜態成員,因為沒有this指標。但是非靜態成員函式可以呼叫靜態成員。
靜態成員變數和普通成員變數區別?
(1)生命週期
靜態成員變數在編譯期間建立初始化並且一直存在;
普通成員變數是在建立物件時建立的,物件銷毀普通成員變數也銷毀。
(2)共享方式
靜態成員變數屬於類,而不是具體的屬於某乙個物件,sizeof求大小並不包含靜態成員變數。
普通成員變數屬於某個具體的物件所有。
靜態成員函式和普通成員函式區別?
(1)靜態成員函式沒有this指標,不可以訪問普通成員。但是普通成員變數可以訪問任何成員
(2)靜態成員函式不可以用const修飾,但是普通成員函式可以。
static(C語言和C )彙總
在c語言中static既可以修飾變數也可以修飾函式。static修飾變數又分為修飾區域性變數和修飾全域性變數。static修飾函式改變的是函式的鏈結屬性。一 static修飾區域性變數,改變變數的生命週期,作用域不發生變化。區域性變數定義在函式內部,在呼叫函式時給變數分配棧空間,函式呼叫結束,釋放該...
C語言和 C 語言關係
沒有深思熟慮的設計過程 使用時存在很多 灰色地帶 殘留量過多低階語言的特徵 直接利用指標進行記憶體操作 最終程式執行效率的高效 當面向過程方 暴露越來越多的缺陷的時候,業界開始考慮在工程專案中引入物件導向的設計方法,而第乙個需要解決的問題就是 高效的物件導向語言,並且能夠相容已經存在的 c語言 物件...
C語言和指標
c語言的陣列有兩個值得注意的地方 c語言中只有一維陣列,並且陣列的大小必須在編譯期就確定為乙個常數 對於乙個陣列,我們只能做兩件事,確定該陣列的大小以及獲得指向該陣列下標為0的元素的指標 也就是陣列名 補充 上述第二點同樣適用於多為陣列,例如int a 3 2 那麼a表示的是乙個指向a 0 中下標為...