實 習 內 容 | |
實 習 目 標 |
瞭解並且熟悉
|
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 裡面存放資料的變化。 |