阿摩線上測驗 登入

申論題資訊

試卷:94年 - 94 交通事業公路升資考試_員級晉高員級_資訊管理、資訊處理:程式語言#38990
科目:程式語言
年份:94年
排序:0

題組內容

五、C語言的參數傳遞為以值傳遞(passed by value),若需達到以址傳遞(passed by address) 則必須利用些技巧(如"&")。考慮下列程式片段,並求出 swap()執行後變數 left 及 right 的值各為多少?

申論題內容

⑴void main( ){ int left = 2, right = 5; swap(left, right); } void swap(int a, int b){ int temp; temp = a; a = b; b = temp; }(10 分)

詳解 (共 1 筆)

詳解 提供者:hchungw
在C語言中,參數傳遞是以值傳遞的方式進行的(pass by value),這意味著當你調用一個函數時,傳遞給函數的是參數的副本,而不是參數的引用。如果要實現以址傳遞(pass by address),需要利用指標(pointers)。考慮以下程式片段,並求出 swap() 執行後變數 left 及 right 的值各為多少。
題組
c
複製程式碼
void main() {
    int left = 2, right = 5;
    swap(left, right);
    // 這裡輸出 left 和 right 的值
}
void swap(int a, int b) {
    int temp;
    temp = a;
    a = b;
    b = temp;
}
分析
在這個程式中,swap() 函數的參數 a 和 b 是以值傳遞的方式進行的。這意味著當你在 main() 函數中調用 swap(left, right) 時,left 和 right 的值會被複製給 a 和 b,而在 swap() 函數內部對 a 和 b 所做的任何修改都不會影響到 main() 函數中的 left 和 right。
在 main() 中,left 被初始化為2,right 被初始化為5。
當調用 swap(left, right) 時,left 的值2被複製給 a,right 的值5被複製給 b。
在 swap() 函數內部:
temp 被初始化為 a 的值,即2。
a 被賦值為 b 的值,即5。
b 被賦值為 temp 的值,即2。
函數執行完畢後,a 和 b 的值雖然交換了,但這並不會影響到 main() 函數中的 left 和 right。
結論
由於 swap() 函數內部的值傳遞並沒有改變 main() 函數中的 left 和 right,所以 swap() 執行後,left 仍然是2,right 仍然是5。
修改以實現地址傳遞
如果需要實現地址傳遞,可以使用指標。以下是修改後的程式:
c
複製程式碼
#include <stdio.h>
void swap(int *a, int *b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}
void main() {
    int left = 2, right = 5;
    swap(&left, &right);
    printf("left = %d, right = %d\n", left, right);  // 輸出:left = 5, right = 2
}
在這個修改後的程式中,通過傳遞 left 和 right 的地址,swap() 函數能夠直接修改 main() 函數中的變量值。