2016-11-19 82 views
0

在这个小测试程序,可以有人给我解释一下:指针类的数据成员

  • 为什么每个地址印在两个循环一样吗?
  • 为什么它不同于一个循环到另一个循环?

    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次

+2

因为'b'是矢量元素的*拷贝*,而不是矢量元素本身。 –

+1

尝试'(A&b:vec)'查看'vector'中的地址。 –

+0

非常感谢,我感到非常愚蠢。 – Treycos

回答

1

如果您想查看相同的地址,则需要查看向量中的地址,而不是临时副本的地址。

使用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"; 
    ... 
} 
1

在基于for循环此范围:

for (A b : vec) 
     std::cout << &(b.v) << "\n"; 

b是载体中的元素的副本。这就是为什么你看到10次相同的地址。对于两个不同的循环它是不同的,因为该复制恰好在不同的存储位置。您可能想要:

for (A& b : vec) 
     std::cout << &(b.v) << "\n"; 

这里b是对向量中元素的引用。