2013-04-23 26 views
-2

我剛開始學習C,我很困惑爲什麼我必須使用指針來實現交換功能?爲什麼我不能傳遞變量來實現交換功能?

版本,其中交換不起作用:

#include <stdio.h> 

void swap(int i, int j) { 
    int t = i; 
    i = j; 
    j = t; 
} 

int main() { 
    int a = 23, b = 47; 
    printf("Before. a: %d, b: %d\n", a, b); 
    swap(a,b); 
    printf("After. a: %d, b: %d\n", a, b); 
    return 0; 
} 

版本,其中交換的工作原理:

#include <stdio.h> 

void swap(int *i, int *j) { 
    int t = *i; 
    *i = *j; 
    *j = t; 
} 

void main() { 
    int a = 23, b = 47; 
    printf("Before. a: %d, b: %d\n", a, b); 
    swap(&a, &b); 
    printf("After . a: %d, b: %d\n", a, b); 
} 

回答

3

默認情況下,函數參數按值在C和C++過去了。這基本上意味着在函數中接收到傳遞參數的副本。該副本不同於傳遞的變量,並且此副本上的任何更改都不會反射回傳遞的參數。

因此,您的第一個片段實際上會交換傳遞參數的副本而不是參數本身。

爲了將交換反射回被傳遞的參數,您需要通過引用,在C中這是通過使用指針來實現的。如果參數的地址被傳遞給函數,並且函數實際上對傳遞給它的內存地址進行操作,即:正在傳遞值的原始變量。

1
swap(a,b); 

void swap(int i, int j) { 
    int t = i; 
    i = j; 
    j = t; 
} 

上面的代碼失敗,因爲,將變量i和j是本地給函數swap,這意味着變量具有其範圍限定於功能swap,並且一旦函數終止他們的生活丟失。

一個解決辦法是通過地址使用通如下圖所示的代碼...

swap(&a,&b); 

void swap(int* i, int* j) { 
    int t = *i; 
    i* = *j; 
    j* = t; 
} 

現在變量i和j,是指向原始變量a和b,這意味着它們都作用於代表a和b,因此即使指針在函數內的範圍有限,它們也能夠間接修改變量a和b。

0

你爲什麼提出了兩個方案背靠背?這是兩個獨立的programs.The第一個,儘管其對void main()和東西都謬誤,打算(但沒有,因爲它與局部變量涉及)通過使用一個函數,通過傳遞整數變量ab的副本的函數交換值。這是pass-by-value。事實上,C只有pass-by-value,儘管你的書由Yeshwant Kanetkar said.Anyways,使第一個程序工作,使用printf()swap()函數本身內部顯示交換值,作爲局部變量,值的更改將不顯示在main()中。

void swap(int i, int j) { 
int t = i; 
i = j; 
j = t; 
printf("After. a:%d,b:%d",i,j); 
} 

第二個節目,他可以要求使用pass-by-reference,基本上是pass-by-value其中的變量的地址拷貝傳遞,而不是實際的地址再次themselves.And,儘管它就像void main()非便攜的怪癖,它會交換ab的值。

void swap(int *i, int *j) { 
int t = *i; 
*i = *j; 
*j = t; 
} 

輸出之前。 a:23 b:47 之後。 a:47 b:23

我在CodeBlocks上運行了它。但是那麼您的作者Mr.Void Main必須建議您使用16位Turbo C eh?

0

你不能這樣做掉這樣:

void swap(int i, int j) { 
    int t = i; 
    i = j; 
    j = t; 
} 

因爲ij是按值傳遞。這意味着它與本地變量tmp相同。因此,修改ij實際上不會修改您通過的變量,因爲ij的本地副本不在函數swap()之外。

因爲它的,如果你需要從main()修改ij,你必須傳遞給main()jiswap()地址和。 這就是爲什麼以下版本實際上是有效的。

void swap(int *i, int *j) { 
    int t = *i; 
    *i = *j; 
    *j = t; 
} 

編輯:爲了更好地理解這些東西,我想向您推薦斯坦福大學演講​​,是可以在YouTube。