使用 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
两个注意事项:
我无法修改 main 或它之前的任何内容。我只能修改void change_number
函数,里面的代码是我自己的代码
我无法获得所需的输出——我的代码只在子程序中输出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
表示内存中的一个位置。
函数内部:
x
是int
值
在内存中的地址
*x
是x
指向的内存地址的"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;
涉及从 int
到 int *
(指向 int 的指针)的隐式转换,很可能是一个错误。
函数对其参数所做的是,它会创建一个副本来继续工作,一旦函数的作用域结束,副本就会被释放,它不能更改从 [=21= 传递给函数的参数值] 是指针进来的地方。
将指针传递给函数时,将其视为实际地址的副本,在您的情况下 x
被存储。
因此,为了使用 x 或更改 x,您必须分别使用或更改 *x
(稍后它会在主程序中被 &
取消引用。
就像许多其他人提到的那样 x = *x+3;
应该是 *x = *x+3;
并且您会得到想要的结果
除了在 change 函数中打印之外,您还可以在 main 函数中打印,方法是
*x=*x+3
我遇到了这个问题:
#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
两个注意事项:
我无法修改 main 或它之前的任何内容。我只能修改
void change_number
函数,里面的代码是我自己的代码我无法获得所需的输出——我的代码只在子程序中输出
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
表示内存中的一个位置。
函数内部:
x
是int
值
*x
是x
所以,正如其他人正确指出的那样,函数应该写成
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;
涉及从 int
到 int *
(指向 int 的指针)的隐式转换,很可能是一个错误。
函数对其参数所做的是,它会创建一个副本来继续工作,一旦函数的作用域结束,副本就会被释放,它不能更改从 [=21= 传递给函数的参数值] 是指针进来的地方。
将指针传递给函数时,将其视为实际地址的副本,在您的情况下 x
被存储。
因此,为了使用 x 或更改 x,您必须分别使用或更改 *x
(稍后它会在主程序中被 &
取消引用。
就像许多其他人提到的那样 x = *x+3;
应该是 *x = *x+3;
并且您会得到想要的结果
除了在 change 函数中打印之外,您还可以在 main 函数中打印,方法是 *x=*x+3