Linux C語言高階學習第四天(C高階-函式)

nan_lei發表於2018-07-20

函式(very重點)

一、概念

        一段用來執行某個功能的程式碼-->給你一個值,你處理完之後,再給我一個值。

※編寫程式碼時,一定要清楚你需要實現的功能是什麼?針對於功能設計出函式。

二、為什麼要使用函式

1)避免使主函式main()變得複雜,邏輯混亂

2)避免程式冗長、不精煉;

3)如果需要多次實現某些功能,不使用函式的話則需要重複的話工作量大

--->模組化程式設計

模組化程式設計的特點:高聚合、低耦合-->給一段功能程式碼解耦能體現出你的能力

功能模組:一個或幾個具有特定功能函式構成的程式碼

三、函式定義與使用

函式需要先定義再使用

1、函式的定義

函式四大要素

1.函式名:函式功能程式碼的識別符號;呼叫函式的依據;函式名是函式的首地址(指標那塊細說)

1)函式命名方式:

(1)大駝峰法:函式名內所有單詞首字母大寫

eg.SetStudentName

用於Windows系統

(2)下劃線法:函式名內所有單詞全都小寫,單詞之間以下劃線分割

eg.set_student_name

用於Linux系統

(3)小駝峰法:函式名內第一個單詞全小寫,其餘單詞首字母大寫

eg.setStudentName

用於IOS/Android系統

2.返回值:將函式的執行結果返回給呼叫它的函式

(1)return語句表示函式的返回結果,該語句只會執行一次

(2)函式返回值型別需要與return語句返回的資料型別匹配,否則編譯錯誤

(3)如果函式不需要返回值,則可以將返回值型別設定void,並且可以省略return語句

3.引數列表:函式執行期間需要哪些資料參與運算

(1)引數列表內所有引數的資料型別都要給出來,不得省略

(2)如果函式不需要引數,引數列表的括號也不可以省略

4.函式體:函式執行的功能程式碼

也可以不定義,中進行宣告,在主函式之後再進行定義:返回值型別 函式名(引數型別)

PS:功能和四大要素的關係

1.函式名是給功能程式碼命名

2.返回值是功能程式碼的結果

3.引數列表是    為了完成功能需要的起始資料

4.函式體是實現該功能的程式碼步驟

2、函式的使用

呼叫函式是函式使用的最終目的

函式呼叫的方式:

接受返回值的變數 = 函式名(引數列表);

注意:即使函式引數列表為空,在函式呼叫時引數列表的括號也可以省略。

四、概念理解:

1.主調函式 和 被調函式

    主動發起函式呼叫的函式-->主調函式;主調函式尋找的那個函式-->被調函式

2.形式引數 和 實際引數

    形參:被調函式在定義階段,被調函式的引數列表

    實參:主調函式發起呼叫時,主調函式傳遞給被調函式的值

※形參和實參需要在數量、型別、順序上匹配

為什麼形參叫形參??

形婚:只有夫妻之名,沒有夫妻之實-->形參:只有引數之名,沒有引數之實;如果不呼叫這個函式,這個函式一輩子都沒有記憶體空間;    

主調函式需要負責給被調函式分配記憶體空間,用完之後記憶體就被回收了

PS:函式呼叫的實質:資料的流動

3.區域性變數 和 全域性變數

區域性變數的作用範圍:僅限於當前函式的內部(形參也視為區域性變數)

全域性變數的作用範圍:定義位置開始,直至檔案的結尾-->作用:提供了另一種函式之間資料傳遞的方法

??區域性變數與全域性變數重名??(允許重名)當出現重名時,區域性變數的作用範圍會覆蓋全域性變數的作用範圍

4.值傳遞 和 地址傳遞    (C++  引用傳遞)

(1)值傳遞:

(2)地址傳遞

&    取地址符,給定一個變數,計算該白能量的記憶體地址

*      指標運算子,給定一個地址,取出該地址記憶體的資料

※地址傳遞的特點:

①主調函式傳參給被調函式是地址而非變數的數值

②在被調函式內,指標的*參與運算

值傳遞的特點

1.傳參為數值

2.除了return語句,無法將計算結果發揮主調函式

3.如果主調函式不希望被調函式修改變數的值,則應該採用值傳遞

地址傳遞的特點

1.傳參為地址

2.可以將計算結果返回主調函式

3.如果主調函式希望被調函式修改變數的值,則應該採用地址傳遞

地址傳遞是除了return之外另一種被調函式將計算結果返回給主調函式的途徑

五、陣列傳參

被調函式裡的sizeof(a)/sizeof(a[0])=1

被調函式無法計算陣列長度,因此主調函式需要將陣列長度作為引數一併傳參

PS:當指標和陣列處理的是同一塊記憶體的時候:[]<==>*

陣列<==>基準點+偏移量

這就是為什麼編譯器不會檢查陣列越界的問題,只有執行起來之後你才能看!看!看!出來

語法糖:兩種語法,A和B在編譯時完全等價,但是A寫法比B寫法更加簡便,那麼A就是B的語法糖::[]  是 * 的語法糖

for(①;②;③){④;}<==>①;while(②){③;④;}

for 也就是 while 的語法糖

語法鹽:繁雜的語法

Linux C語言高階學習第四天(C高階-函式)

相關文章