由函數裡輸出資料的參數

 

  實 習 內 容



瞭解並且熟悉

1. 取址運算子 - &

2. 指標資料型態以及所定義的變數

3. 間接存取運算子 - *

1

考慮下面這段程式: 程式要求使用者輸入兩個浮點數, 如果第一個數字比第二個數字小的話, 程式呼叫 swap() 函數把兩個數字交換過來, 如此在呼叫 func() 函數計算之前可以確保 num1 裡面的數值大於等於 num2 裡面的數值

#include <stdio.h>
#include <stdlib.h>

double func(double x, double y);
void swap(double *num1, double *num2);

int main(void)
{
    double num1, num2, tmp;
		
    printf("Please input two numbers: ");
    scanf("%lf%lf", &num1, &num2);
    if (num1 < num2)
    {
        tmp = num1;
        num1 = num2;
        num2 = tmp;
    }

    result = func(num1, num2);
    printf("The result is %lf\n", result);

    system("pause");
    return 0;
}

double func(double x, double y)
{
    // some computations using the values x and y
    return 1.0;
}

2

1. 我們在先前的實習裡知道如何把上面藍色的部份放進一個函數裡

    void getInput(double *num1_ptr, double *num2_ptr)
    {		
        printf("Please input two numbers: ");
        scanf("%lf%lf", num1_ptr, num2_ptr);
        return;
    }
2. 在 main() 函數裡我們必須使用 "取址" 運算子 & 將變數的位址傳入函數中, 如此函數可以順利要求 scanf 將資料由鍵盤讀入並且存放在指定位址的變數裡
    getInput(&num1, &num2);

3

接下來我們要試著把紅色的部份也放進另一個函數裡:

1. 紅色部份的功能是把兩個變數存放的內容交換過來, 我們就叫它做 swap 吧! 概念上很容易, 可是下面這段程式卻無法達成想要的功能

void swap(double var1, double var2)
{
    double tmp = var1;
    var1 = var2;
    var2 = tmp;
}

看起來這個函數中變數(參數) var1 裡的資料和 var2 裡的資料是交換過來了, 但是我們希望達到的是在 main() 裡呼叫

swap(num1, num2);
之後,

變數 num1 裡的資料和變數 num2 裡的資料交換過來, 上面這個函數中變數 var1 一開始的時候資料和 num1 裡的資料相同, 變數 var2 和變數 num2 裡的資料相同, 交換 var1 和 var2 兩個變數裡面資料的時候, 卻和原來的 num1, num2 變數沒有關係了

2. 實際上我們要寫的 swap 函數需要 num1 和 num2 兩個變數的記憶體位址, 在swap 函數裡面才能夠直接讀取和修改變數 num1 和 num2 裡的資料, 所以在宣告的時候我們使用 double * 這種資料型態, 代表 "double 型態變數的記憶體位址" 或是 "double 型態的指標"

    void swap(double *first, double *second)

3. 在函數裡面我們需要新的語法 "間接存取運算子 - *" 來完成 "透過記憶體位址修改變數內容" 的工作

    {
        double tmp;
        tmp = *first;
        *first = *second;
        *second = tmp;
    }

4. main() 裡面呼叫的程式碼需要是

    if (num1 < num2)
        swap(&num1, &num2);

5. 在上面 swap 函數中變數 first 裡面存放的是變數 num1 的記憶體位址, 變數 second 裡面存放的是變數 num2 的記憶體位址, 在函數裡當你寫 *first 時就代表變數 num1, 當你寫 *second 時就代表變數 num2, 透過 *first 可以把變數 num1 裡面的資料取出來, 也可以把資料寫到變數 num1 裡, 運算子 " * " 就稱為 間接存取運算子

6. 你可以用原始碼偵錯器來觀察 main() 函數中變數 num1 num2 裡面存放資料在程式執行過程中的變化, 以及 swap() 函數中變數 first second 裡面存放資料的變化。

程式設計課程 首頁

製作日期: 10/14/2012 by 丁培毅 (Pei-yih Ting)
E-mail: pyting@mail.ntou.edu.tw TEL: 02 24622192x6615
海洋大學 電機資訊學院 資訊工程學系 Lagoon