注意:定義乙個全域性變數後,可以在函式內部重新定義該變數,接下來的程式都使用重新定義的變數,從定義開始起作用。
區域性變數和全域性變數同名時,區域性變數會覆蓋全域性變數。
eg:#include
int i=9;
int main()
結果顯示:
i=9;
i=658291;(系統內部的乙個值)
不同作用域(
scpoe)的區域性變數可以同名,不衝突;
(1)區域性變數
在函式內部定義的變數(形參也是區域性變數),作用域僅限於定義的函式內部。
(2)全域性變數
函式外部定義的變數,不屬於哪乙個函式,屬於乙個源程式,作用域是整個源程式。
注意:在復合語句中也可以定義變數,但是只作用於復合語句中。
eg:void example()
printf("%d\n",b);
}此時會報錯,因為for迴圈中定義的b不能在for迴圈外面使用。
從變數的生存期(存在的作用時間)角度來看,可以分為靜態儲存方式和動態儲存方式。
使用者儲存空間可以分為三個部分:
(1)程式區;
(2)靜態儲存區;
(3)動態儲存區;
靜態儲存區:
全域性變數和靜態變數全部存放在靜態儲存區,在程式開始進行時給全域性變數分配儲存空間,程式執行完畢後就釋放,在執行過程中,它們佔據固定的儲存單元,而不動態的進行分配和釋放
動態儲存區存放的資料:
(1)函式的形參
(2)區域性變數(限於auto型別,即未參加static宣告的區域性變數)
auto變數
函式的區域性變數,如果沒有宣告為static,函式中定義的區域性變數全部預設為auto型別。auto變數包括未加static宣告的區域性變數(包括在復合語句中定義的變數)和函式的形參。在呼叫函式時系統會給它們分配儲存空間,在函式呼叫結束後就自動的釋放這些空間。屬於動態儲存方式。
static變數
用static宣告的區域性變數在函式呼叫結束後而不消失保留原來的值。
eg1:
eg2:
int i;
int i;
for(i=0;i<3;i++)
for(i=0;i<3;i++)
}結果顯示:2 3 4
結果顯示:2 2 2
區別:static區域性變數定義使用完後會值會儲存下來,所以使用static區域性變數定義只需要一次賦值,eg1中for迴圈中b時static區域性變數,每一次迴圈後b不會重新定義;eg2中每一次for迴圈b都是重新定義了的。
可以這麼說,static區域性變數相當於定義該變數的函式中的全域性變數。如果這麼寫 static int b; b=1;此時eg1結果為2 2 2;必須是定義時就初始化,因為定義和賦值分開後,迴圈內部會重複賦值。
靜態區域性變數的說明:
(1)靜態區域性變數屬於靜態儲存類別,即在靜態儲存區分配記憶體單元。
(2)靜態區域性變數在編譯時賦初值,即只用賦一次值;而自動變數賦值是在函式呼叫時進行的,函式結束後就釋放,每呼叫一次函式就賦一次值。
(3)如果定義區域性變數時沒有賦值,對於靜態區域性變數來說,如果是數值型變數那麼會自動賦值為0,如果是字元型變數那麼會自動的賦值為空字元;對於自動變數來說,如果在定義是沒有賦值,系統會自動賦乙個不確定的值。
靜態區域性變數和全域性變數的區別:
靜態區域性變數的作用域僅限於所定義的函式中,但是函式結束後變數值會保留。全域性變數從定義開始作用域整個原始檔直至結束。
暫存器變數(register)
暫存器變數可以提高c語言的執行效率,即將區域性變數的值存入cpu的暫存器中。
注意:(1)只有動態儲存的變數(自動區域性變數和形參)才可以作為暫存器變數來儲存,區域性靜態變數不可以定義為暫存器變數。
(2)計算機的暫存器數目有限的,不能定義任意多個暫存器變數。
外部變數(extern)
外部變數(即全域性變數的外部表現形式)是在函式外部定義的變數。全域性變數的作用域為從定義開始到原始檔結束。extern對該變數作外部變數說明,擴充套件程式中的變數的作用域。
外部變數的一些用法:
eg:void main()
int b;
如果乙個變數在函式後面定義的,但是函式中又需要使用,可以在使用前對變數進行外部說明,如eg。同時如果乙個變數在檔案f1中定義的但是想在檔案f2中使用,同樣可以在使用前進行外部說明,前提兩個檔案在編譯時要建立起聯絡。
c語言定義的五大記憶體區:
(1)棧區(stack)
存放函式形參和區域性(auto)變數;由編譯器自動分配和釋放。filo(first in last out)
(2)堆區(heap)
(申請空間)該區由程式設計師申請後使用,需要手動釋放,否則會造成記憶體洩漏。如果程式設計師沒有手動釋放,那麼程式結束時可能由os**
申請空間的函式:malloc ---- free ;new ---- delete
(3)全域性區(靜態區) static:
存放全域性變數和靜態區域性變數;這兩種變數是放在一塊的,初始化的全域性變數和靜態區域性變數放在一塊,未初始化的放在另一塊。
(4)(文字)常量區:(存放常量)
常量字串存放在這裡,程式結束後由系統釋放
(5)**區:存放二進位制**
malloc原理:
malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,
另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果
這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符
合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。
volatile:宣告變數在程式執行中,可被隱含的改變(拒絕編譯器的優化)
告訴編譯器修飾的變數是隨時變化的,每次使用都必須從記憶體中去取出它的值。如果乙個暫存器或變數,表示乙個埠或者多個執行緒的共享資料,需要用volatile,保證對特殊位址的訪問。
變數如果加了volatile修飾,則會從記憶體中重新裝載內容,而不是直接從暫存器中拷貝內容。
const :宣告為常量,不允許被改變。
bool變數的介紹以及應用 C語言
標頭檔案引用 include 型別bool,它具有yes值和no值 true 代表1 false代表2 應用 可以把重複的字元挑選出來,避免輸出重複的字元 例題 pta 1029 舊鍵盤 20分 輸入格式 輸入在 2 行中分別給出應該輸入的文字 以及實際被輸入的文字。每段文字是不超過 80 個字元的...
微控制器原理及應用以及單機片的主要分類
圖1 微控制器是由cpu 記憶體 外圍功能等部分組成的。如果將微控制器比作人,那麼cpu是負責思考的,記憶體是負責記憶的,外圍功能相當於視覺的感官系統及控制手腳動作的神經系統。圖1 微控制器的構成要素 儘管我們說cpu相當於人的大腦,但是它卻不能像人的大腦一樣,能有意識的 自發的思考。cpu只能依次...
C語言中的變數的分類
c語言中的變數,有區域性變數和全域性變數。一 區域性變數 區域性變數又稱內部變數,由某物件或某個函式所建立的變數通常都是區域性變數,只能被內部引用,而無法被其它物件或函式引用。二 全域性變數 全域性變數即外部變數,建立在函式的外部的變數,可以建立在程式中的任何位置。全部變數是可以被本程式中的任何函式...