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

时间:2016-02-16 13:40:48

标签: c pointers void

我遇到了这个问题:

#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,但在主程序中没有更改。

  3. 我如何改变主程序中的值?请记住,我是C的新手,并且还不知道很多东西(事实上,我昨天刚刚介绍了指针)。

5 个答案:

答案 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表示内存中的位置。

功能内部:

xint

的内存地址

*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;

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

答案 3 :(得分:1)

函数的作用是什么,它使副本工作,一旦函数的作用域结束,复制被释放,不能改变从外部传递给函数的参数值。这是指针进来的地方。 将指针传递给函数时,请将其视为真实地址的副本,在您的情况下x存储。

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

与许多其他人提到的x = *x+3;应该是*x = *x+3;并且您将获得所需的结果

答案 4 :(得分:0)

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