如果这听起来含糊其辞或愚蠢,我很抱歉,但请考虑以下几点:

如果我有一个如下所示的main函数:

int main(void)
{
   int red_wins = 0;
  game_loop(&red_wins); 
  // code 
  printf("red has %d wins\n", red_wins); 
} 

然后有一个调用使用red_win的另一个函数的a Game_loop函数:

void game_loop(int *red_wins)
{
  // code 
  particle_move(red_wins);
}

然后是另一个使用RED_WINS变量的名为PERGET_MOVE的函数:

void particle_move(int *red_wins) 
{
  // code 
  if (such and such)
  {
    *red_wins+= 10; 
  } 
}

如果只在particle_move函数中修改red_wins,并且只从game_loop函数中调用particle_move,那么是像上面所示那样做还是通过传递指向particle_move函数中的指针的指针来更好呢?或者,但我被告知这是一种糟糕的做法,使用全局变量red_wins?或者有没有其他更好的方式让我忽略?

推荐答案

在以下情况下,您只需将指针传递给指针:

  • 其中,调用的函数正在更新pointer值,而不是所指向的对象:
    void update( T **p )
    {
      *p = new_TStar_value();
    }
    int main( void ) { T *var; update( &var ); // updates var }
  • 其中指针指向指针序列中的第一个:
    void foo( int **p )
    {
      // do something interesting
    }
    int main( void ) { int **p = malloc( sizeof *p * ROWS ); if ( p ) { for ( size_t i = 0; i < ROWS; i++ ) p[i] = malloc( sizeof *p[i] * COLS ) } foo( p ); return 0; }

在您的情况下,particle_move正在更新的内容与game_loop正在更新的内容相同,因此您不需要添加另一层间接层.你做得对,给你.

C++相关问答推荐

为什么已经设置的值在C中被重置为for循环条件中的新值?

在32位处理器上优化53—32位模计算>

括号中的堆栈实现错误问题

MISRA C:2012 11.3违规强制转换(FLOAT*)到(uint32_t*)

两个连续的语句是否按顺序排列?

堆栈在作用域阻塞后会被释放吗?

将指针作为参数传递给函数

Kdb:仅升级指定的列

这个计算C中阶乘的函数正确吗?

为什么realloc函数在此代码中修改变量?

通过k&;r语法的c声明无效

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

将非连续物理内存映射到用户空间

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

访问未对齐联合的成员是否为未定义行为,即使被访问的成员已充分对齐?

变量的指针右对齐,函数的指针左对齐

clion.我无法理解 Clion 中发生的 scanf 错误

当 a 是代码块时使用逗号运算符 (a, b)

窗口消息处理函数以某种方式更改了应保持不变的 int 变量的值