c語言,全域性變數,靜態變數問題,C語言,全域性變數,靜態變數問題

2022-02-16 07:08:58 字數 3412 閱讀 5260

1樓:匿名使用者

全域性變數 一般指在程式入口地址之前定義的資料(c語言源程式裡面是在main函式之前定義,windows程式是在winmain函式之前定義的資料),全域性變數一般不需要加任何關鍵字宣告。直接在main函式之前定義int a;就可以了。要注意全域性變數是在編譯時分配儲存單元的,所以如果你不對它初始化的話編譯器會自動把它初始化為0,全域性變數的作用域為整個程式,所以一個程式裡面所有的子程式(函式)都能使用它。

區域性變數 因為全域性變數可以被一個程式的所有函式使用,所以為了防止程式裡面一個函式專用的資料被其他函式有意或無意的修改,所以引入了區域性變數,區域性變數可以用auto關鍵字申明,但是一般都省略auto關鍵字,區域性變數是在函式裡面定義的,比如在主函式裡面定義int a=0;在fun函式裡面定義int b=0;區域性變數是在程式執行的時候臨時分配儲存單元的,它儲存在堆疊段中,每個函式開始執行前都會先算出這個函式裡面有多少個區域性變數,佔多少個儲存空間,然後增加堆疊段空間以容納這些資料,因為是臨時分配的儲存空間,所以所有的區域性變數都是未初始化的,它裡面的資料是其他函式用過的垃圾資料,你必須要給區域性變數賦初值。在函式結束後會釋放堆疊段空間,也就是區域性變數只在它所在的函式的生命週期內有效。當一個函式執行結束後這個函式內的全部區域性變數就全部不能用了。

靜態變數 因為區域性變數的生命週期只在改區域性變數所在的函式生命週期內有效,但是在很多程式內一個函式內的區域性變數往往要保留,以便改函式下次呼叫時使用,所以就有了靜態變數這個概念。靜態變數與全域性變數差不多,也是在編譯時分配記憶體空間,並且自動初始化為0,靜態變數的生命週期也是整個程式。但是與全域性變數不同的是靜態變數只有它所在的函式能夠使用它,程式裡面其他的函式是不能夠訪問它的。

靜態變數必須用static關鍵字申明。比如 static int a;

2樓:匿名使用者

全域性變數必須是static 型別

這句話是錯的 static 型別全域性變數是全域性變數的其中一種形式

c語言靜態區域性變數和全域性變數有什麼區別,不都是在整個程式中都有效嗎。希望能舉個簡單的例子,謝謝啦

3樓:

(1)靜態區域性變數在函式內定義,但不象自動變數那樣,當呼叫時就存在,退出函式時就消失。靜態區域性變數始終存在著,也就是說它的生存期為整個源程式。

(2)靜態區域性變數的生存期雖然為整個源程式,但是其作用域仍與自動變數相同,即只能在定義該變數的函式內使用該變數。退出該函式後, 儘管該變數還繼續存在,但不能使用它。

(3)對基本型別的靜態區域性變數若在說明時未賦以初值,則系統自動賦予0值。而對自動變數不賦初值,則其值是不定的。

根據靜態區域性變數的特點, 可以看出它是一種生存期為整個原始檔的量。雖然離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。 因此,當多次呼叫一個函式且要求在呼叫之間保留某些變數的值時,可考慮採用靜態區域性變數。

雖然用全域性變數也可以達到上述目的,但全域性變數有時會造成意外的***(尤其是短名全域性變數的變數名汙染很嚴重),因此仍以採用區域性靜態變數為宜。

簡單的說靜態區域性變數與全域性變數最明顯的區別就在於:全域性變數在其定義後所有函式都能用,但是靜態區域性變數只能在一個函式裡面用。

4樓:醉棋

靜態區域性變數只能在定義該變數的函式內使用,全域性變數可以在任意函式內使用。

5樓:陸美富

首先要清楚「整個程式」這個概念。

一個程式由多個編譯單位組成。每個可進行單獨編譯的原始檔稱為「編譯單位」。

在同一編譯單位內用extern說明符來擴充套件全域性變數的作用域。

當用static說明符說明全域性變數時,此變數可稱作「靜態」全域性變數。靜態全域性變數只限於本編譯單位使用,不能被其它編譯單位所引用。

6樓:

按儲存區域分:全域性變數、靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區

按作用域分:全域性變數在整個工程檔案內都有效;靜態全域性變數只在定義它的檔案內有效;靜態區域性變數只在定義它的函式內有效,只是程式僅分配一次記憶體,函式返回後,該變數不會消失;區域性變數在定義它的函式內有效,但是函式返回後失效。

全域性變數和靜態變數如果沒有手工初始化,則由編譯器初始化為0。區域性變數的值不可知。

**如下:

//test.cpp

#include

extern int a;//變數宣告,不是定義static int b=5;

void func1()

//main.cpp

int a;

int b=10;

void func2()

void func1();

void main()

輸出結果為52012

7樓:幽靈詛咒師

單就你這個問題,回答就一句話,作用域不一樣。

簡單例子:

靜態區域性變數:只有定義這個變數的當前cpp能找到他的定義,其他cpp哪怕extern這個變數,包含對標頭檔案,要用,編譯都會報錯找不到。(至於生命週期,好比a.

cpp裡main函式,b.cpp裡定義一個b類,類裡面一個函式裡static int i(預設為0),並列印,賦另外一個值2,再列印,a.cpp裡呼叫b類裡這個函式兩次,第一次列印0,2;第二次列印2,2,就是說明這個變數在程式沒關的時候,哪怕出了b.

cpp,static int i的靜態區域性變數的值還在(但是你就是沒法直接在a.cpp裡extern來用這個i,要想這麼幹,請用全域性變數))

ps:靜態區域性變數和靜態全域性變數也差不多這意思,作用域,前者定義他的大括號裡可用,後者定義它的cpp檔案裡隨便用。靜態就是指作用域只在定義它的範圍(區域性or全域性)

全域性變數:同一個程式,其他cpp裡面只要extern這個變數,就能找到這個變數,且只要加好鎖,這個程式沒關掉,這個變數的數值就有確實含義(沒被delete)

8樓:小飛花兒的憂傷

作用域不同;編譯時期不同

c語言 為什麼靜態全域性變數可以在別的檔案中引用

9樓:匿名使用者

你要弄明白什麼叫別的檔案

比如a 檔案中定義了一個 static int i=0;

然後b檔案用include包含了a檔案,那麼對於b檔案來說,a檔案就不是別的檔案,它就是b檔案的一部分

靜態全域性變數只能在本原始檔中使用,意思是你不能用extern 來宣告另外一個檔案裡的靜態全域性變數

比如 a檔案裡的static int i =0;

那麼b檔案裡extren int i就是行不通的,而如果a檔案的i不是static的 , 那麼extern int i就可以

10樓:滄海雄風

你弄錯了

你把你**貼上來

11樓:匿名使用者

你是在標頭檔案中宣告的嗎?

有關vb全域性變數的問題,有關vb全域性變數的問題

顯示的資料,是固定下來的,你可以在1窗體中賦值的時候,也同時對2窗體的相應位置賦值,如 在第1窗體中 mynum 2 form2.label1.caption mynum 假設在第二窗體中,是顯示在label中的 你的mynum是動態的值嗎。就是隨時再變的。如果不是的話就不應該呀!再不就是你再調出f...

C語言!對於學生的四門課成績,利用全域性變數,用函式求出所有成績的最高分及最低分

include float min,max struct student s 5 main min max s 0 a 0 for i 0 i 5 i for j 0 j 4 j 咯咯 c語言程式設計 錄入評委的成績,評委人數不定,成績為負數時,錄入結束,並求出最高分和最低分。求解 includei...

c語言中變數指標輸出問題,C語言中變數指標輸出問題

這和printf用 s的規則相關。首先ps是一個指向字元型資料的指標 printf用 s修飾輸出時需要提供一個指標,這個指標指向的資料是字元型的,但printf將按照字串的規則來進行輸出,也就是輸出完這個指標指向的字元後,自動將指標加1,並判斷指向的字元是否為0,否則將輸出直至指向的資料為0為止,或...