调用此功能时为什么没有效果?

时间:2015-11-04 09:54:52

标签: c function

我是新手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;
}

出现此错误的原因是什么?

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

这是一个非常简单的案例。

在C中,它使用一种名为Call-By-Value的方法来评估函数参数。 这意味着当您使用参数调用函数时,被调用函数将接收这些参数的值而不是参数。

在此计划中,功能&#34;更改&#34;接收整数50(&#39; a&#39;保持的值)和10而不是a和10.所以我是50,当你调用函数时j是10。在功能中我改为60.但是仍然是一样的。如果你添加一个printf()来打印&#34中的i的值;改变&#34;你可以看到发生的变化。

所以要做出改变&#34;有效的你必须使用指针,一个特殊的&#34;工具&#34;在C.

你必须改变你的改变&#34;功能如下:

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

你也应该改变电话。

int main()
{
    int a = 50, b = 10;
    /* printf line */
    change(&a, &b);
    /* printf line */
}

在功能&#34;改变&#34;

   void change(int i, int j)
     

变为

   void change(int *pi, int *pj)

这意味着pi,pj是指向int的指针。 pi&amp; pj是用于保存变量地址的变量。

*pi&amp; *pj是位于pi&amp;的地址中的变量。 pj有。 这意味着*pi引用(指向)a*pj指向b

   *pi += *pj
     

等于

   a = a + b;

你可以看到我改变了方式&#34;改变&#34;称为

现在是

   change(&a, &b);
     

而不是

   change(a, 10);
&符号(&amp;)给出变量的地址 因此&amp; a和&amp; b是&amp; a和&amp; b的地址。 b,这意味着在pi和pj中持有

我认为这个冗长的答案会对你有所帮助。但是你应该阅读一些关于指针的课程。

答案 2 :(得分:1)

i中的变量jchange()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;
}