我一直在尝试更改数组中变量的值。我认为下面的代码会产生
的结果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;
}
答案 0 :(得分:4)
为什么以下代码不会更改
的值a
,...
因为a
和b
的副本用于初始化原始数组。
......我怎样才能重写呢?
您不能使用原始引用数组来执行此操作(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';
}
答案 1 :(得分:1)
初始化int c[2] = { a, b };
将值a
复制到数组c
的第一个元素中。
从此刻开始,a
和c[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
超出范围,向量内的值仍然有效。