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

C++ 将指针从一个向量复制到另一个向量;地址指向变化?,c++,pointers,vector,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_b

我有一个指向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;
}
编辑: 将cout行更改为:

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

您正在打印指针的地址。相反,您希望看到指针的值。取而代之的是

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

cout这个评论完全错误:

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

因此
g
没有指向
v
中整数的指针,它的指针与
v

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

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


&*(v.at(i))
是愚蠢的、完全多余的。这与
v.at(i)

打印指针的地址相同。为什么你关心向量内部存储的对象的地址是什么?我不是100%确定,但我认为你可能打印的是指针的地址,而不是指针指向的地址。。。。在研究了你的代码之后,我明白了你的意思是“地址不一样,当我期望它们是一样的”
&*(v.at(I))
是可爱的模糊:)只要写
v.at(I)
@dani指针的值(你的第I个元素)就是它指向的地方。如果
p
是指针,
&*p==p
&v0=0x2203010   &g0=0x2203010
&v1=0x2203050   &g1=0x2203050
 cout<<"v"<<i<<"="<<(v.at(i))<<"   g"<<i<<"="<<(g.at(i))<<endl;
//copy all pointers to g; g shall have pointers to the int's in v