指针类的数据成员
问题描述:
在这个小测试程序,可以有人给我解释一下:指针类的数据成员
- 为什么每个地址印在两个循环一样吗?
-
为什么它不同于一个循环到另一个循环?
struct A { A(){ std::cout << &v << "\n"; }; int v; }; int main() { std::vector<A> vec; int i = 10; while (i--) vec.push_back(A()); for (A b : vec) std::cout << &(b.v) << "\n"; while (true); return 0; }
事实上,我期望看到10个不同的地址重复2次
答
如果您想查看相同的地址,则需要查看向量中的地址,而不是临时副本的地址。
使用vector::emplace_back
,您可以在施工期间看到矢量内的地址(请参阅emplace_back)。参考访问会在迭代过程中为您提供向量内的地址。
int main()
{
std::vector<A> vec;
int i = 10;
while (i--)
vec.emplace_back();
for (const A& b : vec)
std::cout << &(b.v) << "\n";
...
}
答
在基于for循环此范围:
for (A b : vec)
std::cout << &(b.v) << "\n";
b
是载体中的元素的副本。这就是为什么你看到10次相同的地址。对于两个不同的循环它是不同的,因为该复制恰好在不同的存储位置。您可能想要:
for (A& b : vec)
std::cout << &(b.v) << "\n";
这里b
是对向量中元素的引用。
因为'b'是矢量元素的*拷贝*,而不是矢量元素本身。 –
尝试'(A&b:vec)'查看'vector'中的地址。 –
非常感谢,我感到非常愚蠢。 – Treycos