數(shù)組在程序設(shè)計(jì)中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數(shù)據(jù)元素的集合稱為數(shù)組。
在C語言中, 數(shù)組屬于構(gòu)造數(shù)據(jù)類型。一個數(shù)組可以分解為多個數(shù)組元素,這些數(shù)組元素可以是基本數(shù)據(jù)類型或是構(gòu)造類型。因此按數(shù)組元素的類型不同,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等各種類別。
數(shù)組說明的一般形式為:
類型說明符 數(shù)組名 [常量表達(dá)式],……;
其中,類型說明符是任一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型。 數(shù)組名是用戶定義的數(shù)組標(biāo)識符。 方括號中的常量表達(dá)式表示數(shù)據(jù)元素的個數(shù),也稱為數(shù)組的長度。
對于數(shù)組類型說明應(yīng)注意:
數(shù)組的類型實(shí)際上是指數(shù)組元素的取值類型。對于同一個數(shù)組,其所有元素的數(shù)據(jù)類型都是相同的。數(shù)組名的書寫規(guī)則應(yīng)符合標(biāo)識符的書寫規(guī)定。數(shù)組名不能與其它變量名相同。方括號中常量表達(dá)式表示數(shù)組元素的個數(shù)。不能在方括號中用變量來表示元素的個數(shù), 但是可以是符號常數(shù)或常量表達(dá)式。允許在同一個類型說明中,說明多個數(shù)組和多個變量。
C語言對數(shù)組的初始賦值還有以下幾點(diǎn)規(guī)定:
可以只給部分元素賦初值。當(dāng){ }中值的個數(shù)少于元素個數(shù)時,只給前面部分元素賦值。
例如static int a[10]={0,1,2,3,4};表示只給a[0]~a[4]5個元素賦值,而后5個元素自動賦0值。
只能給元素逐個賦值,不能給數(shù)組整體賦值。
例如給十個元素全部賦1值,只能寫為: static int a[10]={1,1,1,1,1,1,1,1,1,1};而不能寫為:static int a[10]=1;
如不給可初始化的數(shù)組賦初值,則全部元素均為0值。
如給全部元素賦值,則在數(shù)組說明中, 可以不給出數(shù)組元素的個數(shù)。
例如static int a[5]={1,2,3,4,5};可寫為: static int a[]={1,2,3,4,5};動態(tài)賦值可以在程序執(zhí)行過程中,對數(shù)組作動態(tài)賦值。 這時可用循環(huán)語句配合scanf函數(shù)逐個對數(shù)組元素賦值。
字符數(shù)組:用來存放字符量的數(shù)組稱為字符數(shù)組。字符數(shù)組類型說明的形式與前面介紹的數(shù)值數(shù)組相同。
C語言允許用字符串的方式對數(shù)組作初始化賦值。用字符串方式賦值比用字符逐個賦值要多占一個字節(jié), 用于存放字符串結(jié)束標(biāo)志'\0'。
函數(shù)
C源程序是由函數(shù)組成的。 雖然在前面各章的程序中都只有一個主函數(shù)main(), 但實(shí)用程序往往由多個函數(shù)組成。函數(shù)是C源程序的基本模塊, 通過對函數(shù)模塊的調(diào)用實(shí)現(xiàn)特定的功能。
從函數(shù)定義的角度看,函數(shù)可分為庫函數(shù)和用戶定義函數(shù)兩種。
庫函數(shù)由C系統(tǒng)提供,用戶無須定義, 也不必在程序中作類型說明,只需在程序前包含有該函數(shù)原型的頭文件即可在程序中直接調(diào)用。
用戶定義函數(shù)由用戶按需要寫的函數(shù)。對于用戶自定義函數(shù), 不僅要在程序中定義函數(shù)本身, 而且在主調(diào)函數(shù)模塊中還必須對該被調(diào)函數(shù)進(jìn)行類型說明,然后才能使用。
C語言的函數(shù)兼有其它語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。有返回值函數(shù),此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個執(zhí)行結(jié)果, 稱為函數(shù)返回值。如數(shù)學(xué)函數(shù)即屬于此類函數(shù)。 由用戶定義的這種要返回函數(shù)值的函數(shù),必須在函數(shù)定義和函數(shù)說明中明確返回值的類型。無返回值函數(shù),此類函數(shù)用于完成某項(xiàng)特定的處理任務(wù), 執(zhí)行完成后不向調(diào)用者返回函數(shù)值。這類函數(shù)類似于其它語言的過程。 由于函數(shù)無須返回值,用戶在定義此類函數(shù)時可指定它的返回為“空類型”, 空類型的說明符為“void”。
從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看又可分為無參函數(shù)和有參函數(shù)兩種。
無參函數(shù),函數(shù)定義、函數(shù)說明及函數(shù)調(diào)用中均不帶參數(shù)。 主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳送。 此類函數(shù)通常用來完成一組指定的功能,可以返回或不返回函數(shù)值。有參函數(shù),也稱為帶參函數(shù)。在函數(shù)定義及函數(shù)說明時都有參數(shù), 稱為形式參數(shù)(簡稱為形參)。在函數(shù)調(diào)用時也必須給出參數(shù), 稱為實(shí)際參數(shù)(簡稱為實(shí)參)。 進(jìn)行函數(shù)調(diào)用時,主調(diào)函數(shù)將把實(shí)參的值傳送給形參,供被調(diào)函數(shù)使用。
C語言提供了極為豐富的庫函數(shù), 這些庫函數(shù)又可從功能角度作以下分類。
(1)字符類型分類函數(shù)
用于對字符按ASCII碼分類:字母,數(shù)字,控制字符,分隔符,大小寫字母等。
(2)轉(zhuǎn)換函數(shù)
用于字符或字符串的轉(zhuǎn)換;在字符量和各類數(shù)字量 (整型, 實(shí)型等)之間進(jìn)行轉(zhuǎn)換;在大、小寫之間進(jìn)行轉(zhuǎn)換。
(3)目錄路徑函數(shù)
用于文件目錄和路徑操作。
(4)診斷函數(shù)
用于內(nèi)部錯誤檢測。
(5)圖形函數(shù)
用于屏幕管理和各種圖形功能。
(6)輸入輸出函數(shù)
用于完成輸入輸出功能。
(7)接口函數(shù)
用于與DOS,BIOS和硬件的接口。
(8)字符串函數(shù)
用于字符串操作和處理。
(9)內(nèi)存管理函數(shù)
用于內(nèi)存管理。
(10)數(shù)學(xué)函數(shù)
用于數(shù)學(xué)函數(shù)計(jì)算。
(11)日期和時間函數(shù)
用于日期,時間轉(zhuǎn)換操作。
(12)進(jìn)程控制函數(shù)
用于進(jìn)程管理和控制。
(13)其它函數(shù)
用于其它各種功能。
C語言中,所有的函數(shù)定義,包括主函數(shù)main在內(nèi),都是平行的。也就是說,在一個函數(shù)的函數(shù)體內(nèi), 不能再定義另一個函數(shù), 即不能嵌套定義。但是函數(shù)之間允許相互調(diào)用,也允許嵌套調(diào)用。習(xí)慣上把調(diào)用者稱為主調(diào)函數(shù)。 函數(shù)還可以自己調(diào)用自己,稱為遞歸調(diào)用。main 函數(shù)是主函數(shù),它可以調(diào)用其它函數(shù),而不允許被其它函數(shù)調(diào)用。 因此,C程序的執(zhí)行總是從main函數(shù)開始, 完成對其它函數(shù)的調(diào)用后再返回到main函數(shù),最后由main函數(shù)結(jié)束整個程序。一個C源程序必須有,也只能有一個主函數(shù)main。
函數(shù)的參數(shù)分為形參和實(shí)參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用, 離開該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。 形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時, 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
1.形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時, 即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。 函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
2.實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等, 無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。
3.實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致, 否則會發(fā)生“類型不匹配”的錯誤。
4.函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。 即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參。 因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實(shí)參中的值不會變化。實(shí)參的值不隨形參的變化而變化。
用數(shù)組名作函數(shù)參數(shù)與用數(shù)組元素作實(shí)參有幾點(diǎn)不同:
1. 用數(shù)組元素作實(shí)參時,只要數(shù)組類型和函數(shù)的形參變量的類型一致,那么作為下標(biāo)變量的數(shù)組元素的類型也和函數(shù)形參變量的類型是一致的。因此, 并不要求函數(shù)的形參也是下標(biāo)變量。 換句話說,對數(shù)組元素的處理是按普通變量對待的。用數(shù)組名作函數(shù)參數(shù)時, 則要求形參和相對應(yīng)的實(shí)參都必須是類型相同的數(shù)組,都必須有明確的數(shù)組說明。當(dāng)形參和實(shí)參二者不一致時,即會發(fā)生錯誤。
2. 在普通變量或下標(biāo)變量作函數(shù)參數(shù)時,形參變量和實(shí)參變量是由編譯系統(tǒng)分配的兩個不同的內(nèi)存單元。在函數(shù)調(diào)用時發(fā)生的值傳送是把實(shí)參變量的值賦予形參變量。在用數(shù)組名作函數(shù)參數(shù)時,不是進(jìn)行值的傳送,即不是把實(shí)參數(shù)組的每一個元素的值都賦予形參數(shù)組的各個元素。因?yàn)閷?shí)際上形參數(shù)組并不存在,編譯系統(tǒng)不為形參數(shù)組分配內(nèi)存。那么,數(shù)據(jù)的傳送是如何實(shí)現(xiàn)的呢? 在第四章中我們曾介紹過,數(shù)組名就是數(shù)組的首地址。因此在數(shù)組名作函數(shù)參數(shù)時所進(jìn)行的傳送只是地址的傳送, 也就是說把實(shí)參數(shù)組的首地址賦予形參數(shù)組名。形參數(shù)組名取得該首地址之后,也就等于有了實(shí)在的數(shù)組。實(shí)際上是形參數(shù)組和實(shí)參數(shù)組為同一數(shù)組,共同擁有一段內(nèi)存空間。
C語言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級函數(shù)和下一級函數(shù)的問題。 但是C語言允許在一個函數(shù)的定義中出現(xiàn)對另一個函數(shù)的調(diào)用。 這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。即在被調(diào)函數(shù)中又調(diào)用其它函數(shù)。 這與其它語言的子程序嵌套的情形是類似的。
一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。 這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中, 主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。 每調(diào)用一次就進(jìn)入新的一層。