【问题标题】:Pass by value-doesn't execute as I want it [duplicate]按值传递-不会按我的意愿执行[重复]
【发布时间】:2023-03-14 22:35:01
【问题描述】:

我不明白C中传值的概念。这是我的功能:

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

当我调用函数时:

int y=3; 

add(y);

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

【问题讨论】:

  • 因为您已将其命名。它是按值传递的。值被传递,变量本身没有。
  • 谢谢大家!这很清楚!所以基本上,如果我们想修改 c 中的值,我们可以: 1).不要对函数 2) 使用 void。使用指针。

标签: c


【解决方案1】:

按值传递会创建参数的副本。函数中改变的正是这个副本

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

因此,您所做的更改是针对副本而不是您的 main 范围内的变量(您希望看到更改)。

如果您想通过将函数作为参数传递来更改函数中的变量,则不能按值传递。你可以改变你的函数以通过这样的指针传递

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

并像这样将整数的地址传递给函数

int y=3;
add(&y);

main()

指针 仍然是按值传递的,因此它是正在执行的指针的副本,但这并不重要,因为您不是在更改指针本身,而是在更改它指向的变量的值。

【讨论】:

    【解决方案2】:

    这个函数:

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

    本质上是这样说的:创建一个名为 add 的函数,它不返回任何内容 (void),并采用单个整数参数 x。然后调用函数:

    y = 3;
    add(y);
    

    这表示“将名为y 的变量设置为3。现在调用add() 函数作为参数传递y当前值,即3。这与

    add(3);
    

    参数x 完全是函数add() 的局部变量。它只存在于函数内部,不影响函数外部的任何东西。

    因此,您的函数尽职尽责地将您提供的数字加 1,然后将其丢弃。就像你说的那样。

    C 不像其他语言那样“通过引用传递”,您可以在其中告诉函数对变量本身而不是其当前值进行操作。但是,它确实有指针,可以完成类似的事情。

    【讨论】:

      【解决方案3】:

      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 中模拟传递引用的方式。

      【讨论】:

        【解决方案4】:

        您可以使用代码解决上述问题:

        int add(int x) { x=x+1; 返回 x;} 然后使用 一个新的变量,比如 k=添加(y); 然后打印 k。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-02
          • 2019-05-07
          • 2012-03-12
          • 2013-09-15
          相关资源
          最近更新 更多