在函数内的C中更新(int)变量

时间:2014-05-15 00:49:09

标签: c

我试图在我简单的C蛇游戏中编写一个改变屏幕的功能。

main(){
  int stage = 0;
  ...
  ..
  .
  while(stage!=0){
    //if snake hits wall
    changeStage(stage);
  }
}

功能:

void changeStage(int stage){
  stage = 1;
}

此代码不会更新代码,它会继续运行。 我的代码出了什么问题?

5 个答案:

答案 0 :(得分:16)

stage按值传递给changeStagestage = 1仅更改stagechangeStage的本地值,而不更改stagemain的值。你必须改为使用指针:

while (stage != 0) {
    changeStage(&stage);
}

void changeStage(int *stage) {
    *stage = 1;
}

答案 1 :(得分:7)

C是一种按值传递的语言。完成所需操作的最简单方法是将引用传递给您需要更改的变量。例如:

void changeStage(int *stage){
  *stage = 1;
}

main(){
  int score = 0;
  int stage = 0;
  ...
  ..
  .
  while(stage!=0){
    //if snake hits wall
    changeStage(&stage);
 }
}

注意:如果您刚开始使用C编程,可能需要阅读完全理解代码的指针。在示例代码中,您不是传递'stage'的值,而是传递存储'stage'值的位置。然后,该函数可以修改位置中的内容。

答案 2 :(得分:3)

C函数参数是按值传递的。这意味着您不是将引用传递给stage,而是传递存储在其中的值。您在changeStage函数中执行的更新仅适用于已创建的副本。

如果要更新另一个函数中的变量,则需要将指针传递给它。

void changeStage(int* stage_p){
    *stage_p = 1;
}

int main() {
    //...
    while(stage!=0){
        //if snake hits wall
        changeStage(&stage);
    }
}

&stage表示取stage的地址并将其传递给该函数。然后stage_p参数将指向main中的int。

*stage_p会导致它使用stage_p指向的值,在您的案例中为主stage

Further reading

答案 3 :(得分:3)

您不是要修改原始stage变量,而是仅修改changeStage函数中的本地副本

您需要使用指针:

void changeStage(int* stage)
{
  *stage = 1;
}

使用函数:

while (stage != 0)
{
    // if snake hits wall
    changeStage(&stage);
}

您需要了解更多C语言的基本概念。指针是C语言中非常重要的特性。

答案 4 :(得分:2)

正确,如果你想改变main()中变量的值,你需要传递指针,或者你可以创建它作为全局变量,这样它在函数和main中都可以访问。

static int stage = 0;

void changeStage(){
  stage = 1;
  }

main(){
int score = 0;

 ...
 ..
 .
 while(stage!=0){
   //if snake hits wall
   changeStage();
 }
}