更改数组中的声明变量

时间:2017-10-10 21:37:46

标签: c++ arrays variables

我一直在尝试更改数组中变量的值。我认为下面的代码会产生

的结果
1, 1

但实际上它产生了

1, 0

表示a从未更改过。所以我的问题是:为什么下面的代码不会改变a的值,我怎么能重写它呢?

#include <iostream>

int main()
{
    int a = 0;
    int b = 0;
    int c[2] = { a, b };
    c[0]++;
    std::cout << c[0] << ", " << a;
}

2 个答案:

答案 0 :(得分:4)

  

为什么以下代码不会更改a,...

的值

因为ab的副本用于初始化原始数组。

  

......我怎样才能重写呢?

您不能使用原始引用数组来执行此操作(won't compile),但使用std::reference_wrapper可以正常工作:

#include <iostream>
#include <functional>

int main()
{
    int a = 0;
    int b = 0;
    std::reference_wrapper<int> c[2] = { a, b };
    c[0]++;

    std::cout << c[0] << ", " << a << '\n';
}

查看live demo

答案 1 :(得分:1)

初始化int c[2] = { a, b };将值a复制到数组c的第一个元素中。

从此刻开始,ac[0]是应用程序内存空间中的两个不同值。

更改一个不会影响另一个。

如果您想更改此设置,则应使用其他答案建议的reference_wrapper或使用shared_ptr

int main()
{
    auto a = std::make_shared<int>(0);
    auto b = std::make_shared<int>(0);
    std::shared_ptr<int> c[2] = { a, b };
    (*c[0])++;
    std::cout << *c[0] << ", " << *a;
}

注意:使用shared_ptr - s确保即使a超出范围,向量内的值仍然有效。