2015-11-04 160 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; 
} 
相关问题