传值-不按照我的预期执行

18 浏览
0 Comments

传值-不按照我的预期执行

我不理解C语言中的按值传递的概念。这是我的函数:\n

void add(int x){
   x = x+1;
}

\n当我调用这个函数时:\n

int y=3; 
add(y);

\n但是当我编译时,我仍然得到3。有人告诉我这与按值传递有关,但我仍然不明白。有人能解释一下为什么吗?

0
0 Comments

在C中,所有的函数参数都是按值传递的。这意味着参数(在这种情况下,在`add`中定义的`x`)被初始化为参数的值的一个副本(在这种情况下,`y`,其值为`3`)。

由于`x`是一个局部变量,执行`x = x + 1;`会改变`x`的值,但是在函数返回后,这个改变不会产生任何效果,因为`x`已经不存在了。

需要注意的是,参数不一定是一个变量的名称。你可以合法地这样调用你的函数:

`add(42);`

`x`被初始化为`42` -- 但是`x = x + 1`肯定不会改变`42`的值。

如果你想要修改这个值,你可以让函数`返回`新的值:

int add(int x) {    
    return x + 1;
}

调用者可以对结果做任何操作,包括将其赋值回变量:

int y = 3;
y = add(y);

或者你可以传递要修改的对象的`地址`:

int add(int *x) {
    *x = *x + 1;
}

然后调用者可以这样做:

int y = 3;
add(&y);

这仍然是按值传递,但传递的值是一个指针值,即`x`的地址。这是我们在C中如何`模拟`按引用传递的方式。

0
0 Comments

这个问题的出现的原因是在C语言中,函数的参数是通过传值方式传递的。在函数中,参数被视为函数内部的局部变量,它们的改变不会影响函数外部的变量。

解决这个问题的方法是使用指针。通过传递变量的指针作为参数,可以在函数内部直接修改变量的值,从而达到期望的效果。

下面是修改后的代码示例:

void add(int* x) {
    *x = *x + 1;
}
int main() {
    int y = 3;
    add(&y);
    // 现在 y 的值被修改为 4
    return 0;
}

在这个示例中,函数 `add` 的参数类型变为 `int*`,表示它接收一个指向整数的指针。在函数内部,使用 `*x` 来访问指针指向的变量,并对其进行修改。在 `main` 函数中,我们通过 `&y` 来获取变量 `y` 的地址,并将其传递给 `add` 函数。

通过这种方式,函数 `add` 就能直接修改变量 `y` 的值,使其增加了1,从而达到了预期的效果。

0
0 Comments

问题出现的原因是因为使用了传值方式(pass by value),这会创建参数的一个副本,而在函数中对副本进行的修改并不会影响到主函数(main)中的变量。

解决方法是改为使用传指针方式(pass by pointer)。通过将参数声明为指针类型,并在函数中使用指针解引用操作来修改变量的值。具体做法是将函数改为以下形式:

void add(int* x){
   *x = *x + 1;
}

然后,在主函数(main)中,将变量的地址作为参数传递给函数,例如:

int y=3;
add(&y);

这样,在函数中对变量的修改将会影响到主函数中的变量值。

需要注意的是,虽然指针是按值传递的,但这并不重要,因为我们修改的是指针所指向的变量的值,而不是指针本身。

0