標籤:
主題1:函數1.為什麼要用函數1.1.避免主函數變得龐雜,頭緒不清,方便閱讀和維護程式。1.2.避免一個功能多次編寫代碼2.模組化程式設計1.1目的:簡化程式設計的過程。1.2好處:一次寫好後,以後隨用隨調。3.函數就是功能。每一個函數用來實現一個特定的功能。函數的名字應反映其代表的功能。4.函式宣告的作用是把有關函數的資訊(函數名、函數類型、函數參數的個數與類型)通知編譯系統,以便在編譯系統對程式進行編譯時間,在進行到main函數調用該函數時知道它們是函數而不是變數或其他對象。此外還對調用函數的正確性進行檢查(如類型、函數名、參數個數、參數類型等是否正確)。5.一個來源程式檔案是一個編譯模組,在程式編譯時間是以來源程式檔案為單位進行編譯的,而不是以函數為單位進行編譯的。6.函數的定義7.空函數的作用:為了擴充程式的功能。同時使程式的結構清楚,可讀性好,現在結構中佔用一個位置8.定義函數的目的是為了調用此函數,以得到預期的結果。9.形參:是在函數括弧裡定義的 實參:是傳來的值10.形參和實參間的資料傳遞在調用函數過程中,系統會把實參的值傳遞給被調用函數的形參。或者說,形參從實參得到一個值。該值在函數調用期間有效,可以參加該函數的運算。11.函數定義:無分號,有函數體 函式宣告:有分號,沒函數體12.實參可以是常量、變數或運算式。實參與形參的類型應相同或者複製相容。13.在定義函數中指定的形參,在未出現函數調用時,它們並不佔記憶體的儲存單元。在發生函數調用時,函數的形參被臨時分配記憶體單元,和實參的記憶體單元不同。因為值記憶體單元不同,所有形參值的改變不會影響到實參值。14.函數的首行稱為函數原型。20115.函式宣告中形參名可以省寫,而唯寫形參的類型。16.如果已在檔案的開頭(在所有函數之前),已對本檔案中所調用的函數進行了聲明,則在各函數中不必對其所調用的函數再作聲明。17.函數不可以嵌套定義,但可以嵌套調用18.在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞迴調用。這是C語言的一大特點。19.一個遞迴的問題可以分“回溯”和“遞推”兩個階段。20920.n-1,1,3,2 1,3 n-1,2,1,3主題2:數組作為函數參數1.1數組元素作函數參數,向形參傳遞的是數組元素的值。單向傳遞。數組元素只可以做實參。1.2數組名做函數參數,向形參傳遞的是數組第一個元素的地址。數組名既可以做實參也可以做形參。1.3例子1.3.1.在main函數中 聲明函數1:float average(float array[10]); 調用語句:average(score);//已定義數組的數組名 函數1的定義:float average(float array[10]);//也可以不指定數組大小,唯寫一個方括弧13.2.實際上,在編譯時間把形參數組名處理為一個指標變數,用來接收一個地址。13.3.當需要數組長度來控制迴圈次數時,可以把數組的實際長度從實參傳遞給在形參列表增加的一個形參裡。14.多維陣列名作函數參數,形參的一維的大小可不去限定,但第二維的大小要指定,而且要和實參數組的第2維度。實參就是數組名。15.局部變數:複合陳述式(分程式)內的變數,在外面無效,出了這個範圍,系統就會把它佔用的記憶體單元釋放掉。16.全部變數的有效範圍從定義變數的位置開始到本源檔案結束。作用是增加了函數間資料聯絡的渠道。17.C程式設計中的全域變數名的第1個字母用大寫表示,但非規定。18.全域變數的缺點18.1.在全部執行過程中都佔用儲存單元18.2.降低了函數的可靠性和通用性,因為函數移植另一個檔案時,全部變數也要移動,當全域變數和其他檔案的變數同名時,就會出現問題。18.3.在程式設計中,在劃分模組時要求模組的內聚性強,與其他模組的耦合性弱。即不要把許多互不相干的功能放到一個模組中,與其他模組的相互影響要盡量少。18.4.使用全域變數過多,讓人們無法清楚判斷出每個時間點這個變數的值。降低了程式的清晰性。19.在C語言中,每一個變數和函數都有兩個屬性:資料類型和資料的儲存類別。儲存類別指的是資料在記憶體中儲存的方式(如靜態儲存和動態儲存裝置)。20.局部變數的儲存類別20.1.自動變數 auto 不寫就是預設的auto 動態儲存裝置區20.2.靜態變數,在函數調用結束後,它並不釋放,保留當前的值。靜態儲存區21.解釋21.1.對靜態局部變數是在編譯時間賦初值的,即只賦初值一次,在程式運行時它已有初值。如果定義時沒賦初值,系統給賦值0或者‘\0’。21.2對自動變數,系統自動賦的值是不確定的。因為實質上是給它分配的儲存單元內容是不可知的。比如被上一個變數使用過但內容沒清空。21.3.靜態局部變數只能被本函數引用,不能被其他函數引用。21.4.靜態局部變數會長久佔用記憶體。22.寄存器變數(register 變數)可以將局部變數的值存放在CPU中的寄存器中,提高執行效率,適用頻繁適用該變數的情況下。23.全域變數的儲存類型 主題3:全域變數的儲存類型。1.1.作用是用來擴充外部變數的範圍2.全域變數都是存放在靜態儲存區中的。因此他們的生存期是固定的,存在於程式的整個運行過程。3.在一個檔案內擴充外部變數的範圍。3.1.情況:如果外部變數不在檔案的開頭定義,其有效作用範圍只限於定義處到檔案結束。在定義點之前的函數不能引用該外部變數。3.2.解決:用關鍵字 extern3.3.例子:在定義點之前寫 extern int A,B,C;這個時候在定義點之前就可以使用它了 。4.將外部變數的範圍擴充到其他檔案4.1.情況:如果程式由多個來源程式檔案組成,那麼在一個檔案中想引用另一個檔案中已定義的外部變數4.2.解決:在任一個檔案中定義外部變數A,而在另一個檔案中用extern對該變數名作聲明:extern A;這時的A的範圍就擴充到了這個檔案中。4.3.問題:怎樣編譯和運行包括多個檔案的程式。5.系統怎麼區分3.1和3.2的情況答:在編譯時間遇到extern時,先再本檔案中找外部變數的定義,如果找到,就在本檔案中擴充範圍;如果找不到,就在串連時從其他檔案中找外部變數的定義。如果從其他檔案中找到了,就將範圍擴充到本檔案;如果再找不到,就按出錯6.將外部變數的範圍限制在本檔案中處理。6.1.情況:在程式設計中希望某些外部變數只限於被本檔案引用,而不能被其他檔案引用。6.2.解決:在定義外部變數時加一個static聲明。6.3.使用:在本檔案中聲明:static int A ;這時在另一個檔案在 extern A;將會出錯。這叫做:靜態外部變數。6.4.意義:1)避免被其他檔案誤用2)這相當於把本檔案的外部變數對外界“屏蔽”起來,從其他檔案的角度看,這個靜態外部變數時“看不見,不能被引用的”。6.5.注意:儲存類別關鍵字不能單獨使用7.為什麼要討論局部變數和全域變數?7.1.這個問題的本質是變數的範圍,那麼為什麼會引出範圍7.2.因為有這麼一個問題:在一個函數中定義的變數,在其他函數中能否被引用?在不同位置定義的變數,在什麼範圍內有效???而這就涉及到了變數的範圍。8.儲存類別小結8.1。對一個資料的定義:要利用相關的關鍵字指定資料類型和儲存類型這兩種屬性。用extern聲明已定義的外部變數。9.變數的三個角度:1)範圍[空間]2)生存期[時間]3)存放的位置 。其中1和2是變數的兩個屬性,有聯絡,但意思不同。10.變數的聲明和定義10.1.本質都是聲明,定義是一種特殊的聲明,特殊在建立了儲存空間。10.2.只是為了敘述方面:才有了聲明和定義看似不同的說法。1)把建立儲存空間的聲明稱定義,不建立的,稱為聲明。2)即定義性聲明和引用性聲明;前者簡稱定義後著簡稱聲明;10.3.所謂聲明,其作用是聲明該變數是一個已在其他地方已定義的外部變數,僅僅是為了擴充該變數的作用範圍而作的“聲明”。 主題4:內建函式和外部函數1.1.引入:出於和變數相同的分析。根據函數能否被其他源檔案調用,將函數區分為內建函式和外部函數。2.內建函式 本檔案2.1.定義:static 類型名 函數名(形參表);只能被本檔案使用3.外部函數 其他檔案3.1.函數首部:extern int fun(int a,intb)表示是在其他檔案中定義的外部函數3.2.C語言規定,不寫extern 預設是外部函數 233 主題5:對函數的聲明用extern能夠在本檔案中調用在其他檔案中定義的函數,或者說把該函數的範圍擴充到本檔案。2.函數的首行叫做函數的原型。extern聲明的形式就是在函數原型基礎上加關鍵字extern3.函數的本質是外部的,於是extern可以省略。4.由2,3知道用函數原型就能夠把函數的範圍擴充到定義該函數的檔案之外(不必用extern)。函數原型通知編譯系統:該函數在本檔案中稍後定義,或者另一個檔案中定義。5.#include指令的應用就是利用函數原型擴充函數範圍。因為它所指定的標頭檔裡包含了輸入輸出等相關函數的原型和其他相關資訊。
C語言學習(2)函數複習