【问题标题】:How to modify a global struct when passed as a parameter to a function (c++)?作为参数传递给函数(c ++)时如何修改全局结构?
【发布时间】:2020-02-14 05:13:18
【问题描述】:

假设我有这个全局结构

struct input_shift_register
{
    bool not_used;
    int data;
    int *ptr_to_data;
};

我想在函数中传递它的一个实例来修改它的数据

void share_data(input_shift_register shift) {
shift.data = 5;
}

这只会修改函数内部结构的本地副本。我怎样才能修改“真正的”全局结构呢?很抱歉,这可能很简单,但我在网上找不到答案。

【问题讨论】:

  • 使用传递引用(声明参数为input_shift_register &shift

标签: c++ struct parameters scope


【解决方案1】:

你基本上有两个选择。

  • 通过引用传递
void share_data(input_shift_register& shift) {
  shift.data = 5;
}

这将确保您的函数参数是绑定到函数参数的引用(别名),因此您正在处理在调用站点传递给函数的实际变量。

  • 按指针传递
void share_data(input_shift_register* shift) {
  shift->data = 5;
}

这将确保您传递变量的地址,因此在调用站点您应该将地址作为参数传递,即share_data(&shift_register);

如果您确实按值传递(如在您的代码中),它只会传递参数的副本,并且函数将使用该副本,而不是实际变量。

有关详细讨论,请查看以下内容。

What's the difference between passing by reference vs. passing by value?

【讨论】:

    【解决方案2】:

    传递引用和传递值是您可以根据特定需求使用的两种方式。

    不过,你也可以试试这个:

    input_shift_register share_data(input_shift_register shift) 
    {
        shift.data = 5;
        return shift;
    }
    
    
    input_shift_register var;
    var = share_data(var)
    

    如果您以这种方式定义函数,则调用者可以选择将函数的返回值分配给原始 var 或同一结构的其他变量。

    这是做同样事情的另一种方式。我不会说它是最佳优化的,但它可能适合某些特定要求。

    【讨论】:

      猜你喜欢
      • 2020-05-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      相关资源
      最近更新 更多