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