C語言 變數與函式

2021-05-26 22:31:58 字數 3618 閱讀 6097

形參

未出現函式呼叫時,函式中指定的形參並不佔記憶體中的儲存單元。只有在發生函式呼叫時,函式中的形參才被分配記憶體單元。在呼叫結束後,形參所佔的記憶體單元也被釋放。

實參與形參

在c語言中,實參向對形參的資料傳遞是「值傳遞」,單向傳遞,只由實參傳給形參,而不能由形參傳回來給實參。在記憶體中,實參單元與形參單元是不同的單元。

在呼叫函式時,給形參分配儲存單元,並將實參對應的值傳遞給形參,呼叫結束後,形參單元被釋放,實參單元仍保留並維持原值。因此,在執行乙個被呼叫函式時,形參的值如果發生改變,並不會改變主調函式的實參的值。

從變數的作用域(即從空間)角度來分,可以分為全域性變數和區域性變數。

區域性變數

在乙個函式內部定義的變數是內部變數,它只在本函式範圍內有效,也就是說只有在本函式內才能使用它們,在此函式以外是不能使用這些變數的。這稱為「區域性變數」。

外部變數

在函式內定義的變數是區域性變數,而在函式之外定義的變數稱為外部變數,外部變數是全域性變數(也稱全域性變數)。全域性變數可以為本檔案中其他函式所共用。它的有效範圍為從定義變數的位置開始到本原始檔結束。  全域性變數在程式的全部執行過程中都占用儲存單元,而不是僅在需要時才開闢單元

從變數值存在的時間(即生存期)角度來分,又可以分為靜態儲存方式和動態儲存方式。

靜態儲存方式是指在程式執行期間由系統分配固定的儲存空間的方式。

動態儲存方式是在程式執行期間根據需要進行動態的分配儲存空間的方式。

儲存空間可以分為三部分: 

程式區靜態儲存區

動態儲存區

儲存類別指的是資料在記憶體中儲存的方式。按照儲存方式可以分為兩大類:靜態儲存類和動態儲存類。具體包含四種:

自動的(auto)

靜態的(static)

暫存器的(register)

外部的(extern)

根據變數的儲存類別,可以知道變數的作用域和生存期。 

自動變數

函式中的區域性變數,如不專門宣告為static儲存類別,都是動態地分配儲存空間的,資料儲存在動態儲存區中。函式中的形參和在函式中定義的變數(包括在復合語句中定義的變數),都屬此類,在呼叫該函式時系統會給它們分配儲存空間,在函式呼叫結束時就自動釋放這些儲存空間。因此這類區域性變數稱為自動變數。自動變數用關鍵字auto作儲存類別的宣告。

靜態區域性變數

有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,即其占用的儲存單元不釋放,在下一次該函式呼叫時,該變數已有值,就是上一次函式呼叫結束時的值。這時就應該指定該區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。

靜態區域性變數與自動變數的區別

(1) 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元。在程式整個執行期間都不釋放。而自動變數(即動態區域性變數)屬於動態儲存類別,佔動態儲存區空間而不佔靜態儲存區空間,函式呼叫結束後即釋放。

(2) 對靜態區域性變數是在編譯時賦初值的,即只賦初值一次,在程式執行時它已有初值。以後每次呼叫函式時不再重新賦初值而只是保留上次函式呼叫結束時的值。而對自動變數賦初值,不是在編譯時進行的,而是在函式呼叫時進行,每呼叫一次函式重新給一次初值,相當於執行一次賦值語句。

(3)如在定義區域性變數時不賦初值的話,則對靜態區域性變數來說,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對自動變數來說,如果不賦初值則它的值是乙個不確定的值。這是由於每次函式呼叫結束後儲存單元已釋放,下次呼叫時又重新另分配儲存單元,而所分配的單元中的值是不確定的。

(4) 雖然靜態區域性變數在函式呼叫結束後仍然存在,但其他函式是不能引用它的。

暫存器變數,用關鍵字register作宣告

c語言允許將區域性變數的值放在cpu中的暫存器中,需要用時直接從暫存器取出參加運算,不必再到記憶體中去訪問。由於對暫存器的訪問速度遠高於對記憶體的訪問速度,因此這樣做可以提高執行效率。

外部變數

外部變數是在函式的外部定義的全域性變數,它的作用域是從變數的定義處開始,到本程式檔案的末尾。

(1)從作用域角度分,有區域性變數和全域性變數。它們採用的儲存類別如下:

區域性變數  |自動變數,即動態區域性變數

(離開函式,值就消失)

|靜態區域性變數(離開函式,值仍保留)

|暫存器變數(離開函式,值就消失)

|(形式引數可以定義為自動變數或寄存

器變數)

全域性變數  |靜態外部變數(只限本檔案引用)

|外部變數

(即非靜態的外部變數,允許其他檔案引用)

(2)從變數存在的時間(生存期)來區分,有動態儲存和靜態儲存兩種型別。靜態儲存是程式整個執行時間都存在,而動態儲存則是在呼叫函式時臨時分配單元。

動態儲存  |自動變數(本函式內有效)

|暫存器變數(本函式內有效)

|形式引數(本函式內有效)

靜態儲存  |靜態區域性變數(函式內有效)

|靜態外部變數(本檔案內有效)

|外部變數(其他檔案可引用)

((3)從變數值存放的位置來區分,可分為:

記憶體中靜態儲存區  |靜態區域性變數

|靜態外部變數(函式外部靜態變數)

|外部變數(可為其他檔案引用)

記憶體中動態儲存區:自動變數和形式引數

cpu中的暫存器:暫存器變數

(4) 關於作用域和生存期的概念。從前面敘述可以知道,對乙個變數的性質可以從兩個方面分析,一是變數的作用域,一是變數值存在時間的長短,即生存期。前者是從空間的角度,後者是從時間的角度。二者有聯絡但不是同一回事。

(5)static對區域性變數和全域性變數的作用不同。對區域性變數來說,它使變數由動態儲存方式改變為靜態儲存方式。而對全域性變數來說,它使變數區域性化(區域性於本檔案),但仍為靜態儲存方式。從作用域角度看,凡有static宣告的,其作用域都是侷限的,或者是侷限於本函式內(靜態區域性變數),或者侷限於本檔案內(靜態外部變數)

函式

函式本質上是全域性的,因為乙個函式要被另外的函式呼叫,但是,也可以指定函式不能被其他檔案呼叫。根據函式能否被其他原始檔呼叫,將函式區分為內部函式和外部函式。

內部函式

如果乙個函式只能被本檔案中其他函式所呼叫,它稱為內部函式。在定義內部函式時,在函式名和函式型別的前面加static。即

static 型別識別符號 函式名(形參表)

如   static int fun ( int a , int b )

外部函式

在定義函式時,如果在函式首部的最左端加關鍵字extern,則表示此函式是外部函式,可供其他檔案呼叫。如果在定義函式時省略extern,則隱含為外部函式。在需要呼叫此函式的檔案中,用extern對函式作宣告,表示該函式是在其他檔案中定義的外部函式。

C語言常量與變數

一 常量 1 直接常量 1 整形常量 12u 0l 3 十進位制表示 除表示整數0外,不以0開頭 以0開頭的數字串會被解釋成八進位制數 負數在前面加負號 字尾 l 或 l 表示長整型,u 或 u 表示無符號數。例 345 31684 0 23456 459l 356l 56789u 567lu 八進...

C語言 常量與變數

常量 10 實型常量 小數 單精度float 雙精度double 注意 預設情況下編寫的小數都是雙精度的實型常量,也就是預設情況下所有小數都是double 10.1 雙精度double 88.8 雙精度double 5.2f 單精度float 字元型常量,用單引號括起來的就是字元型常量 注意 字元型...

C語言,變數與記憶體

符號位 最高位為符號位,正數該位為0,負數該位為1 任何數值在記憶體中都是以補碼的形式儲存的。1 10的二進位制形式 1000 0000 0000 0000 0000 0000 0000 1010 原 2 除符號位取反 1111 1111 1111 1111 1111 1111 1111 0101 ...