C 速查手冊

6.5.5 參數與回傳值型態

凡是在 C 語言中可使用的資料型態 (data type) ,包括基本資料型態指標 (pointer) 陣列 (array) 及自己定義的結構 (structure) 皆可用為函數 (function) 的參數 (parameter) 或回傳值型態 (return type) 。

若是沒有回傳值 (return value) 的函數,必須將函數宣告為 void ,同樣的,沒有參數的函數,於參數列也該宣告為 void ,倒是後者沒有嚴格限制。例如以下函數印出新行

#include <stdio.h>

void newline(void);

int main(void)
{
    newline();
    newline();
    newline();
    printf("上面會印出三個新行符號\n");
    
    return 0;
}

void newline(void)
{
    printf("\n");
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:newline.c
    功能:示範沒有回傳值的函數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc newline.c
$ a.out
 
 
 
上面會印出三個新行符號
$

若是參數或回傳值的型態都為基本資料型態,如整數、浮點數或字元,由於 C 語言採用傳值呼叫 (call by value) ,因此函數間傳遞任何數值都是先拷貝一份再傳遞,整數、浮點數或字元所佔記憶體的空間固定且較小,對程式的效率比較沒有影響。如

#include <stdio.h>

int max(int, int);

int main(void)
{
    printf("%d為較大值\n", max(22, 55));
    
    return 0;
}

int max(int a, int b)
{
    return a > b ? a : b;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:maxint.c
    功能:示範回傳較大值的函數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc maxint.c
$ a.out
55為較大值
$

經常使用的字串 (string) ,常以字元指標的方式當作參數,如下例函數 character_count() 接受字元指標當作參數,然回傳字串長度的整數值

#include <stdio.h>

int character_count(char *);

int main(void)
{
    char *saying = "Easier said than done.";
    
    printf("這句英文諺語 \"%s\" 有%d個字母...\n", saying, character_count(saying));
    
    return 0;
}

int character_count(char *word)
{
    int i = 0;
    
    while (word[i] != '\0') {
        i++;
    }
    
    return i;    
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:chcount.c
    功能:示範計算字串長度的函數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc chcount.c
$ a.out
這句英文諺語 "Easier said than done." 有22個字母...
$

傳遞陣列亦如上例,字串也就是字元陣列,陣列名稱就是指向第 1 個元素的指標。至於要在函數間傳遞結構的話,由於 C 語言是利用傳值呼叫,因此會拷貝整個結構的副本進行傳遞,這樣一來有損效率,因此通常只會傳遞結構的成員,而非整個結構。

如果函數需要修改兩個以上的參數並且回傳,由於 C 語言只能回傳單一個值,這時候可以利用指標,例如以下函數將兩個變數的值互換

#include <stdio.h>

void swap(int *, int *);

int main(void)
{
    int a = 22;
    int b = 11;
    
    printf("兩數交換以前.. a = %d, b = %d\n", a, b);
    
    swap(&a, &b);
    
    printf("兩數交換以後.. a = %d, b = %d\n", a, b);
    
    return 0;
}

void swap(int *aPtr, int *bPtr)
{
    int temp;
    
    temp = *aPtr;
    *aPtr = *bPtr;
    *bPtr = temp;
}

/* 《程式語言教學誌》的範例程式
    http://kaiching.org/
    檔名:swap.c
    功能:示範利用指標修改兩個參數
    作者:張凱慶 */

編譯後執行,結果如下

$ gcc swap.c
$ a.out
兩數交換以前.. a = 22, b = 11
兩數交換以後.. a = 11, b = 22
$

上一頁 6.5.4 inline 函數
回 C 速查手冊首頁
下一頁 6.5.6 函數指標
回 C 教材首頁
回程式語言教材首頁