使用 void 子函数更改 main 中的值

Change value in main using void sub-function

我遇到了这个问题:

#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 的新手,很多东西还不知道(事实上,我昨天刚刚介绍了指针)。

代码

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 上取消引用它们)

你应该使用

*x = *x+3;

而不是

x = *x + 3; 

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

函数声明为

void change_number(int *x)

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


函数内部:

xint

在内存中的地址

*xx

指向的内存地址的"content"

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

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 和 & 表示您没有传递 x 的值。

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

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


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

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

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

x = *x+3;

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

函数对其参数所做的是,它会创建一个副本来继续工作,一旦函数的作用域结束,副本就会被释放,它不能更改从 [=21= 传递给函数的参数值] 是指针进来的地方。 将指针传递给函数时,将其视为实际地址的副本,在您的情况下 x 被存储。

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

就像许多其他人提到的那样 x = *x+3; 应该是 *x = *x+3; 并且您会得到想要的结果

除了在 change 函数中打印之外,您还可以在 main 函数中打印,方法是 *x=*x+3