将指针从一个向量复制到另一个向量;地址指向变化?

时间:2015-03-11 14:59:37

标签: c++ pointers vector

我有一个指向int的指针。我喜欢将这些指针复制到另一个向量。但是,地址不一样。为什么,在这种情况下我如何使用*,&,const和auto?请注意,这不是关于智能指针的问题。

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int*> v;
    v.emplace_back(new int(5));
    v.emplace_back(new int(20));

    //copy all pointers to g; g shall have pointers to the int's in v
    vector<int*> g;
    for(const auto& i : v)
        g.emplace_back(i);

    //print all addresses
    for(int i(0); i<2; ++i)
        cout<<"&v"<<i<<"="<<&(v.at(i))<<"   &g"<<i<<"="<<&(g.at(i))<<endl; //will not print the same address

    return 0;
}

输出结果为:

&v0=0x7bb070   &g0=0x7bb090
&v1=0x7bb078   &g1=0x7bb098

编辑: 将cout行更改为:

cout<<"&v"<<i<<"="<<&*(v.at(i))<<"   &g"<<i<<"="<<&*(g.at(i))<<endl; //will not print the same address

输出看起来更好:D,谢谢:

&v0=0x2203010   &g0=0x2203010
&v1=0x2203050   &g1=0x2203050

2 个答案:

答案 0 :(得分:3)

您正在打印指针的地址。相反,你想看到指针的值。而是做

 cout<<"v"<<i<<"="<<(v.at(i))<<"   g"<<i<<"="<<(g.at(i))<<endl;

答案 1 :(得分:2)

这条评论是完全错误的:

//copy all pointers to g; g shall have pointers to the int's in v

v中没有任何整数,只有指向整数的指针!

所以g没有指向v中与<{1>}具有相同指针的整数的指针

然后当您打印出值时,使用v这是错误的。首先,您可以在没有无用括号的情况下编写&(v.at(i)),但更重要的是,您不会打印存储的指针,而是打印它们的地址。

要打印存储的指针,只需使用&v.at(i),这将为两个向量提供相同的值,因为您将值从一个复制到另一个。

v.at(i)只是愚蠢而且完全是多余的。它与&*(v.at(i))

相同