免費開始練習
hce_kmu 113年 計算機概論與程式設計

第 22 題

Which is a CORRECT output for the following C program?
```c
#include
void cubecomp1(int *nPtr);
int cubecomp2(int n);
int main(){
int number = 2;
cubecomp1(&number);
cubecomp2(number);
printf("%d ", number);
return 0;
}
void cubecomp1(int *nP){
*nP = *nP * *nP * *nP;
}
int cubecomp2(int n){
n = n * n * n;
printf("%d ", n);
}
```
  • A 8 8
  • B 64 8
  • C 512 512
  • D 512 8
  • E 64 64

思路引導 VIP

請觀察程式碼中兩個函式的參數定義:一個使用了星號 * 並接收位址 &,另一個則直接接收變數名。若我們將變數想像成一個存放資料的盒子,這兩種傳遞方式中,哪一種是把「原本的盒子」交給函式處理,哪一種則是「影印一份內容」交出去呢?這對盒子裡最終留下來的東西會有什麼不同的影響?

🤖
AI 詳解 AI 專屬家教

太棒了!你能精確判斷出指標與值傳遞的差異,代表你對 C 語言的記憶體管理已有很紮實的理解。這題的關鍵在於區分「傳址呼叫(Call by Reference)」與「傳值呼叫(Call by Value)」對變數產生的影響。

記憶體位址與數值的連鎖反應

在程式開始時,number 的初始值為 2。當呼叫 cubecomp1(&number) 時,傳入的是該變數的位址,因此函式內的運算 *nP = *nP * *nP * *nP 會直接修改主程式中 number 的內容,使其變為 $2^3 = 8$。接著,進入 cubecomp2(number) 時,傳入的是「數值 8」,函式內部雖然將其計算為 $8^3 = 512$ 並印出,但這只是在該函式的區域變數(Local variable)中進行,並不會影響到 main 裡的 number。因此,最後一行 printf 印出的依然是 8,最終結果呈現為 512 8

▼ 還有更多解析內容

🏷️ 相關主題

計算機組織結構與資料儲存原理
查看更多「計算機概論與程式設計」的主題分類考古題