C語言函數最簡單,最細緻,最易懂的函數講解,嗨翻C語言
5 人贊了文章
C語言函數最簡單,最細緻,最易懂的函數講解,嗨翻C語言
一、基本概念
1.什麼是函數
任何一個C語言程序都是由一個或者多個程序段(小程序)構成的,每個程序段都有自己的功能,我們一般稱這些程序段為「函數」。所以,你可以說C語言程序是由函數構成的。
比如你用C語言編寫了一個MP3播放器程序,那麼它的程序結構如下圖所示:
- 從上圖可以看出:函數就是用來實現某個功能的程序段,每一個函數都有自己的功能。因此,你應該把實現某個功能所需的代碼都寫在函數中。比如,有個函數的功能是播放MP3,那麼播放MP3的代碼都應該寫到這個函數中。
- 當調用(執行)一個函數時,計算機就會按順序執行函數中的所有代碼,從而展示函數所實現的功能。
2.函數名
一般來說,我們會將不同的功能交給不同的函數去實現。比如,將暫停播放MP3的代碼寫到一個函數中,將停止播放MP3的代碼寫到另一個函數中。因此,一個C程序中可能會有很多的函數。為了方便調用和區分這些函數,我們需要為每一個函數都起一個唯一的名稱,函數的命名必須按照標識符命名規則。利用函數名就可以調用到對應的函數。
回到頂部
二、函數的定義
1.任何一個函數在使用之前都必須進行定義
定義函數的目的就是為了寫清楚你這個函數是幹啥用的,裡面包含了哪些代碼。函數的定義格式如下:
2.舉例
比如定義一個函數用來計算兩個整數的和。那麼可以寫成下面這樣:
- 分別在第3行、第9行定義了sum函數、main函數,其中sum函數的作用是計算兩個整數的和。
- 函數定義好後,並不會馬上執行函數內部的代碼,要有人調用它才會執行內部的代碼。就好像你的手機雖然有打電話的功能,但是只有按了撥號鍵,才會執行打電話的功能。
- 程序運行時就會先調用main函數,按順序執行第11~14行代碼,因為main函數是程序的入口
- 第11行的sum(10, 11)是調用sum函數,sum函數被調用了,就會分配存儲空間給形式參數列表中的所有參數,也就是第3行中的變數a和變數b,它們都是「形式參數」
- 第11行中的10、11稱為「實際參數」,它們將分別賦值給變數a、變數b,也就是相當於
int a = 10;int b = 11;
- 既然調用了sum函數,就會按順序執行sum函數中的代碼,也就是第5~6行代碼。
- 第5行將a+b的值21賦值給了變數c,第6行使用return關鍵字將變數c返回給了函數調用者,也是說,第11行sum(10, 11)的值是21。那麼變數d的值就是21。
- 第13行的輸出結果為:
d is 21
- 第3~7行中的變數a、b、c都只有在調用sum函數時,才會分配存儲空間,當sum函數執行完畢後,變數a、b、c就會被釋放存儲空間。因此,它們的作用域僅限於sum函數內部。
- 第3行sum左邊的int稱為「返回值類型」,第6行return關鍵字後面跟著的數值稱為「返回值」,因此第6行的變數c就是返回值,返回值的數據類型應該跟「返回值類型」保持一致。
三、形式參數和實際參數
1.基本概念
1> 形式參數:在定義函數時,函數名後面的小括弧()中定義的變數稱為形式參數,簡稱形參
2> 實際參數:在調用函數時傳入的值稱為實際參數,簡稱實參
2.調用函數時傳遞的實參個數 必須和 函數的形參個數必須保持一致
第1行中sum函數中有3個形參,因此在第8行調用sum函數時,需要傳入3個實參
3.當使用基本數據類型(char、int、float等)作為實參時,實參和形參之間只是值傳遞,修改形參的值並不影響到實參
- 在第3行定義了test函數,只有一個形參a
- 在第14行調用了test函數,接著就會分配內存給變數a。這裡將變數b當做實參,那麼變數b的值將傳遞給變數a。這個時候,內存中大致如下圖所示:
(其實在內存中存儲的是二進位數據,這裡我寫成10進位是為了直觀性)
- 執行完第5行代碼後,變數a的值變成了10,但是變數b的值依然是5
- 第16行代碼的輸出結果是:
b的值是5
因此,在函數內部修改了形參的值,並不會影響到外面的實參。
4.函數可以沒有形參
定義一個函數時是可以沒有形參的,比如下面的函數
- 在第3行定義了test函數,可以發現,它的形參列表是空的,也就是沒有形參
- 那麼在第11行調用test函數時,就不用傳遞任何實參
- 其實,第9行定義的main函數也是沒有形參的
四、返回值類型
1.返回值就是函數調用完後,返回給函數調用者的結果,用return關鍵字進行返回。定義函數時,要指明函數的返回值類型
- 第1行定義了一個pi函數,返回值類型是double,因此用return返回的數值應該是double類型的,這裡返回的是3.14
- 第8行pi函數調用完畢後,函數調用者得到的值就是3.14,因此,變數a的值是3.14
2.一個函數可以沒有返回值,如果沒有返回值,應該用void表示返回值類型
- 在第3行定義了一個test函數,它是沒有返回值的,所以第6行的return後面沒有跟上任何數值
- 在第11行調用了test函數
3.如果一個函數沒有返回值,最後面的return語句可以省略
所以,上面的test函數可以簡化成:
4.如果一個函數沒有明確寫出返回值類型,那麼代表這個函數的返回值類型是int
可以看到,第1行定義的sum函數沒有明確寫出返回值類型,那麼這個sum函數的返回值類型就是int。因此,第3行return後面跟隨的是int類型數據
五、return
1.return語句可以在函數內部返回一個值給函數調用者
3行使用了return語句,將a+b的值返回給了函數調用者,因此第8行變數c的值是13
2.一個函數內部可以多次使用return語句,使用了return語句後,函數就會馬上停止執行,return語句後面的代碼就不再被執行
- 這個max函數可以用來求出兩個整數中的最大值
- 如果a大於b,就執行第5行代碼,直接將a返回,函數就會停止執行。也就是說,後面的第8行代碼就不會被執行
- 如果a不大於b,就執行第8行代碼,將b返回
六、函數定義的注意
1.函數名不能重複
默認情況下,函數的名字必須唯一。
2.每一個函數都應該獨立定義,不能嵌套定義
推薦閱讀:
TAG:C語言函數 |