为什么我的迭代器和指针没有给出相同的地址?

时间:2019-05-07 20:26:56

标签: c++

我是C ++的新手。我尝试过begin迭代器,然后使用指针指向向量的第一个元素。然后,我打印它们的地址,它们就是0x6efed8 0x6efedc

我读过迭代器就像指针的抽象。他们都指的是同一元素,所以我认为结果将是相同的。

为什么它们不同?

如果代码中有问题,也请找出来。

 vector<int> data{10,20,30};
    auto i = data.begin();
    auto* j = &data;
    cout << &i << " " << j << endl;

2 个答案:

答案 0 :(得分:4)

让我们稍微重写一下代码:

struct foo { 
    int bar() { return 1; }
};

int main() {
    foo data;
    auto i = data.bar();
    auto* j = &data;
    std::cout << &i << " " << j;
}

i是返回的所有data.bar()的副本。它是不同类型的不同对象,以不同的内存地址存储。 (...如果将foo替换为std::vector<int>,则没有任何改变)

PS:请注意,&data不是指向第一个元素的指针,而该指针将是&data[0],这是又一个地址,因为第一个元素不同于向量本身或迭代器。到第一个元素。

答案 1 :(得分:2)

这里:

 vector<int> data{10,20,30};
 auto i = data.begin();

begin()函数返回一个迭代器,该迭代器引用向量的第一个数据元素-即包含10的元素

同时:

 auto* j = &data;

为您提供指向向量本身而不是任何特定元素的指针。

这是两个完全不同的东西; ij的类型完全不同且不相关。