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

Copy pointers from one vector to another; the adress pointed to changes?

本文关键字:向量 地址 另一个 变化 复制 一个 指针      更新时间:2023-10-16

我有一个指向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

您正在打印指针的地址。相反,您希望查看指针的值。而是做

 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

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

因此,g 没有指向 int 的指针,v它具有v 相同的指针

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

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

&*(v.at(i))只是愚蠢的,完全是多余的。它和v.at(i)一样