2015-11-04 87 views
2

我是新手C學習者,下面的代碼是我的問題:爲什麼這個函數在被調用時沒有效果?

我寫它來改變傳遞變量的值,但在輸出notihng發生了。

這裏是我的代碼:

#inlcude <stdio.h> 

void change(int i, int j) { 
    i = i + j; 
} 

int main() { 
    int a = 50; 

    printf("a before = %d\n", a); 

    change(a, 10); 

    printf("a after = %d\n", a); 
    return 0; 
} 

,這是什麼錯誤的原因是什麼?

+2

OMG。你需要一個基本的C課,不要介意。 –

+2

關於指針的特別長的教訓。 – Arc676

+5

尋找傳遞值,然後閱讀有關指針。 –

回答

2

這是C.

在C語言中一個非常簡單的例子,它使用一個叫做呼叫按值,以評估函數參數的方法。 這意味着當你用你的參數調用一個函數時,被調用的函數接收那些參數的值而不是參數。

在這個程序中,函數「change」收到整數50(值'a'持有)和10而不是a和10.所以當你調用函數時,我是50,j是10。在功能我改爲60.但仍保持不變。如果您添加一個printf()以在「更改」中打印i的值,則可以看到發生了更改。

因此,爲了使「變」有效,你必須在C.

使用指針,一個特殊的「工具」

你必須改變你的「變」有如下功能:

void change(int *pi, int *pj) 
{ 
    *pi += *pj; 
} 

和你也應該改變電話。

int main() 
{ 
    int a = 50, b = 10; 
    /* printf line */ 
    change(&a, &b); 
    /* printf line */ 
} 
在函數 「變化」

void change(int i, int j) 

變爲

void change(int *pi, int *pj) 

這意味着PI,PJ是指向intpi & pj是保存變量地址的變量。

*pi & *pj是駐留在pi & pj具有地址的變量中。 這意味着*pi指(點)a*pjb

*pi += *pj 

等於

a = a + b; 

,你可以看到,我已經改變了方式 「變」叫做

現在是

change(&a, &b); 

代替

change(a, 10); 

與號(&)給出的變量 地址,以便&和& B是& B的地址,這意味着是舉行在pi和pj

我認爲這冗長的答案會幫助你。但是你應該閱讀一些關於指針的課程。 OMG。

+1

爲什麼要通過指針傳遞第二個參數?爲什麼不從函數返回結果?你也使用相當不常見的短語(例如指針不是「工具」)。好吧,也許是爲了嘗試幫助初學者,但沒有做好,因爲無論如何他必須學習術語,否則會變得更加困惑。 – Olaf

1

變量ij in change()main()內部變量的副本。你必須學習指針來實現你想要做的事情。基本上看起來像這樣:

#include <stdio.h> 

void change(int *i, int j) { 
    *i = *i + j; 
} 

int main() { 
    int a = 50; 

    printf("a before = %d\n", a); 

    change(&a, 10); 

    printf("a after = %d\n", a); 
    return 0; 
} 
+0

爲什麼使用指針呢? – Olaf

+0

@Olaf瞭解它們。 – Kotshi

4

函數參數是它的局部變量。函數參數通過拷貝來初始化所提供的參數的值。所以任何參數的改變都不會影響相應的參數。 退出函數後,其參數(局部變量)被銷燬。

例如,你能想象你的函數

void change(int i, int j) { 
    i = i + j; 
} 

被稱爲像

change(a, 10); 

以下方式

void change(/*int i, int j*/) { 
    int i = a; 
    int j = 10; 

    i = i + j; 
} 

正如你可以看到變量本身不會改變。

有兩種方法。第一個參數將通過引用傳遞,否則函數將返回其結果。例如

#inlcude <stdio.h> 

void change(int *i, int j) { 
    *i = *i + j; 
} 

int main() { 
    int a = 50; 

    printf("a before = %d\n", a); 

    change(&a, 10); 

    printf("a after = %d\n", a); 
    return 0; 
} 

或者

#inlcude <stdio.h> 

int change(int i, int j) { 
    i = i + j; 

    return i; 
} 

int main() { 
    int a = 50; 

    printf("a before = %d\n", a); 

    a = change(a, 10); 

    printf("a after = %d\n", a); 
    return 0; 
} 
相關問題