指向类数据成员的指针

时间:2016-11-19 11:46:48

标签: c++ pointers

在这个小小的测试程序中,有人可以解释一下:

  • 为什么两个循环中打印的每个地址都相同?
  • 为什么一个循环与另一个循环不同?

    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;
    }
    

我实际上希望看到十次不同的地址重复2次

2 个答案:

答案 0 :(得分:1)

在此基于循环的范围内:

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

b是向量中元素的副本。这就是为什么你看到10倍相同的地址。两个不同的循环是不同的,因为该副本恰好位于不同的内存位置。你可能想要这个:

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

此处b是对向量中元素的引用。

答案 1 :(得分: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";
    ...
}