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

use*_*718 10 c

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

main(){
  int stage = 0;
  ...
  ..
  .
  while(stage!=0){
    //if snake hits wall
    changeStage(stage);
  }
}
Run Code Online (Sandbox Code Playgroud)

功能:

void changeStage(int stage){
  stage = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

uni*_*rio 16

stage通过值传递给changeStage.stage = 1只改变局部值stagechangeStage,而不是价值stagemain.你必须传递一个指针:

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

void changeStage(int *stage) {
    *stage = 1;
}
Run Code Online (Sandbox Code Playgroud)


the*_*ice 8

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

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

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

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


Rya*_*ing 6

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

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

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

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

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

*stage_p导致它使用 指向的值stage_pstage在您的情况下该值位于 main 中。

进一步阅读