函數

本節主要了解函數的使用。

1、什么是函數?

在編程的過程中,我們總會遇到這樣的事情:有的操作要經常被執行,而一遍又一遍的去寫這些類似的執行過程讓我們覺得很麻煩,函數就是為了解決這樣的問題而產生的,他將我們要經常用到的功能組織成一個個的代碼塊,這些代碼塊像工廠一樣,將我們送給他們的原料(參數)轉化為產品(返回值)。

2、函數的創建

下面我們通過一個簡單的函數來分析一下:

#include <stdio.h>  
  
// 函數的定義(要放在main函數前面)  
int sum(int a, int b) {  
    return a + b;  
}  
  
int main() {  
    int m = 1, n = 2;  
    int s = sum(m, n); // 調用函數  
    printf("m,n的和為:%d\n", s); // 輸出  
}  

在該例子中,我們創建了一個名稱叫 sum 的函數,他接收兩個整數,然后返回兩個整數的和(也是整數)。注意一下,這個函數是寫在main函數的前面。我們從很早就接觸到了main函數,這是一個特殊的函數,每個程序都有一個名叫main的函數,他是整個程序的入口(main函數也是標準函數,他接收來自操作系統的參數,并返回參數給操作系統,只不過他的結束意味著程序的結束)。既然程序是從main函數開始執行的,在main函數執行之前,首先要載入所有需要用到的函數。
查看輸出結果:

m,n的和為:3  

3、函數的參數

對上面的程序中用到的變量進行地址輸出,如下:

a 的地址為:0x7fff5fbff8ac  
b 的地址為:0x7fff5fbff8a8  
m 的地址為:0x7fff5fbff8dc  
n 的地址為:0x7fff5fbff8d8 

可以發現,在該例子中,我們對m,n進行加法計算,實際上用到了四個不同的地址單元,當sum函數被調用的時候,m,n 的值被傳遞到了a,b對應的地址單元,函數對a,b進行操作后返回一個結果。也就是說,實際參與計算的并不是m,n,而是 a,b。這里的a,b稱作形參(形式上的參數),m,n稱作實參(實際的參數)。
那么問題來了,我們如果想對實際的參數進行操作,該如何去做呢?可以通過指針來直接操作地址!

#include <stdio.h>  
  
// 函數的定義  
void upCase(char *c) {  
    *c = *c - 32;  
}  
  
int main() {  
    char c1 = 'a';  
    upCase(&c1);  
    printf("c1 = %c\n", c1);  
} 

在上述代碼中,我們傳遞的是具體的內存地址,所以能夠直接修改對應地址單元的變量,是不是很神奇?結果輸出如下:

c1 = A  

延伸思考:在上面列舉的函數中,我們發現,輸入和輸出的參數都是固定的,但是有的時候,我們可能需要不確定數量的輸入輸出參數,那又怎么辦呢?同樣的,我們也可以通過指針來操作!只需要靈活的分配一些空間給函數使用即可!

#include <stdio.h>  
  
char *aString(){  
    // 創建一塊字符串區域  
    char *str="This is a string!";  
    return str;  
}  
  
int main() {  
    printf("%s\n", aString());  
} 

輸出:

This is a string!  

4、遞歸函數

我們先來看一個題目:計算x的y次方
普通的解題方法:

//計算x的y次方  
int mypow(int x,int y)  {  
    int s=x;  
    for (int i =2; i<=y; i++) {  
        s = s * x;  
    }  
    return s;  
} 

這個方法很容易理解,但是顯得不是很簡潔,而且調用了其他的變量。有一種更為簡潔的方式來實現同樣的功能:

//計算x的y次方  
int mypow(int x,int y) {  
    if (y<=0) return 1; // 終止條件  
    return mypow(x,y-1)*x; // 遞歸  
} 

仔細觀察可以發現,這個函數在他自己的內部調用了函數本身,換句話說,這個函數通過自己調用自己,實現了類似for循環的功能,這種用法稱作遞歸。當然遞歸的使用需要建立在充分的理解的基礎上的,他的目的還是為了進一步利用函數體本身,達到簡化編程,提高執行效率,遞歸的一個必要條件是有終止條件。

5、內置函數

函數的出現大大簡化了程序的設計,我們可以人為的將常用的功能封裝成函數,以供使用,c語言官方封裝了大量的內部函數,有用于字符檢測的、系統輸入輸出的、數學計算的、系統操作的、內存管理的等等,見圖(摘自c語言庫函數速查手冊):


20150207161501904.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容