我遇到了这个问题:
#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的新手,并且还不知道很多东西(事实上,我昨天刚刚介绍了指针)。
答案 0 :(得分:5)
代码
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上取消引用它们)
答案 1 :(得分:4)
你应该使用
*x = *x+3;
而不是
x = *x + 3;
答案 2 :(得分:4)
我认为OP问题的答案需要一点解释,因为C语法有时会让人感到困惑:
该函数声明为
void change_number(int *x)
*
表示输入参数x
是指向int类型变量的指针。换句话说,x
表示内存中的位置。
功能内部:
x
是int
值
*x
是&#34;内容&#34; 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);
amplersand &
表示您未传递x
的值。
相反,您将指针传递给x
,换言之,内存中存储x
内容的地址。
换句话说,x
通过引用传递。
最后一点:在 c 编写程序时(好吧,在任何语言中,特别是在c中),编译器警告 /错误和调试器是你最好的朋友。
此外,当您输入代码时,良好的 IDE 会显示警告。
无论如何......编译器应该警告你
x = *x+3;
涉及从int
到int *
的隐式转换(指向int的指针),很可能是一个错误。
答案 3 :(得分:1)
函数的作用是什么,它使副本工作,一旦函数的作用域结束,复制被释放,不能改变从外部传递给函数的参数值。这是指针进来的地方。
将指针传递给函数时,请将其视为真实地址的副本,在您的情况下x
存储。
因此,为了使用x或更改x,您必须分别使用或更改*x
(稍后在&
的主程序中取消引用它。
与许多其他人提到的x = *x+3;
应该是*x = *x+3;
并且您将获得所需的结果
答案 4 :(得分:0)
除了在更改功能中打印,您还可以通过执行操作在主函数中打印 * X = * X + 3