【问题标题】:Change value in main using void sub-function使用 void 子函数更改 main 中的值
【发布时间】:2016-02-16 13:40:48
【问题描述】:

我遇到了这个问题:

#include <stdio.h>
void change_number(int *x);

int main()
{
   int x;
   printf("Enter the number x: ")
   scanf("%d", &x);
   printf("In the main program: x = %d\n", x);
   change_number(&x);
   printf("In the main program: x = %d\n", x);
   return 0;
}
void change_number(int *x)
{
   x = *x+3;
   printf("In the subroutine: x = %d\n", x);
}

预期输出:

Enter the number x: 555
In the main program: x = 555
In the subroutine: x = 558
In the main program: x = 558

两个音符:

  1. 我无法修改 main 或之​​前的任何内容。我只能修改void change_number函数,里面的代码是我自己的代码。

  2. 我无法获得所需的输出——我的代码只在子程序中输出x+3,但在主程序中没有改变它。

我将如何更改主程序中的值?请记住,我对 C 很陌生,还不太了解(事实上,我昨天刚刚介绍了指针)。

【问题讨论】:

  • 您需要使用标准的 C 编译器编译代码。例如,如果您有 GCC 编译器,则可以使用选项 -std=c11 -pedantic-errors 将其转换为标准 C 编译器。

标签: c pointers void


【解决方案1】:

代码

void change_number(int *x)
{
   x = *x+3;
   printf("In the subroutine: x = %d\n", x);
}

应该阅读

void change_number(int *x)
{
   *x = *x+3;
   printf("In the subroutine: *x = %d\n", *x);
}

这将按预期使用指针(您还需要在 LHS 上取消引用它们)

【讨论】:

    【解决方案2】:

    我认为 OP 问题的答案需要稍微解释一下,因为 C 语法有时可能会令人困惑:

    函数声明为

    void change_number(int *x)
    

    * 表示输入参数x 是一个指向 int 类型变量的指针。换句话说,x 代表内存中的一个位置。


    函数内部:

    xint值在内存中的地址

    *xx指向的内存地址的“内容”

    所以,正如其他正确指出的那样,函数应该写成

    void change_number(int *x)
    {
       *x = *x+3;
       printf("In the subroutine: x = %d\n", *x);
    }
    

    因为当您对*x 采取行动时,您正在对x 指向的内容采取行动


    main() 发生了什么?

    x 是一个 int 变量。

    你打电话给:

    change_number(&x);
    

    amplers 和 &amp; 表示您没有传递 x 的值。

    相反,您传递的是指向x 的指针,换句话说,是存储x 内容的内存地址。

    换句话说,x 是通过引用传递的。


    最后一点:当用 c(嗯,用任何语言,但特别是用 c)编写程序时,编译器 warnings/errors 和调试器是最好的朋友。

    此外,一个好的 IDE 会在您键入代码时向您显示警告。

    无论如何...编译器应该警告你

    x = *x+3;
    

    涉及从 intint *(指向 int 的指针)的隐式转换,很可能是一个错误。

    【讨论】:

      【解决方案3】:

      你应该使用

      *x = *x+3;
      

      而不是

      x = *x + 3; 
      

      【讨论】:

        【解决方案4】:

        函数对其参数的作用是,它会创建一个副本来处理,一旦函数的作用域结束,副本就会被释放,它不能更改从外部传递给函数的参数值。这就是指针的位置进来。 将指针传递给函数时,请将其视为真实地址的副本,在您的情况下,x 存储在该地址中。

        因此,为了使用 x 或更改 x,您必须分别使用或更改 *x(稍后它会在主程序中被 &amp; 取消引用。

        就像许多其他人提到的x = *x+3; 应该是*x = *x+3;,你会得到想要的结果

        【讨论】:

        • ...和 ​​printf("In the subroutine: x = %d\n", *x); 因为 OP 想要打印 x 的值而不是其地址
        • @Paolo:是的,当然。我已经看过所有其他答案,有点忘记了 OP 在他的代码中的 printf 中放了 x 而不是 *x。
        【解决方案5】:

        除了在更改功能中打印,您还可以通过执行在主功能中打印 *x=*x+3

        【讨论】:

          猜你喜欢
          • 2021-11-25
          • 2017-08-26
          • 2019-06-16
          • 2015-04-11
          • 1970-01-01
          • 2018-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多