我正在从这篇文章中学习向量,它们从迭代器开始。他们定义 .begin 和 .end 如下:
begin() – 返回指向向量中第一个元素的迭代器
end() – 返回指向向量中最后一个元素之后的理论元素的迭代器
然后他们给出了以下代码片段,我添加了第三个 for 循环来表达我的问题。
#include<iostream>
#include<vector>
int main() {
std::vector <int> g1; //creating a vector
for (int i = 1; i <= 3; i++){
g1.push_back(i);
}
std::cout << "Output of beginning and end values: ";
for (auto i = g1.begin(); i != g1.end(); i++) {
std::cout << *i << " ";
}
std::cout << "\nOutput of beginning and end addresses: ";
for (auto i = g1.begin(); i != g1.end(); i++) {
std::cout << &i << " ";
}
//"Output of beginning and end values: 1 2 3"
//"Output of beginning and end addresses: 0105FB0C 0105FB0C 0105FB0C"
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的困惑是地址i保持不变,但值i发生了变化。不i*意味着i只是取消引用吗?因此,i如果地址未更改,则某些内容必须更改其值,以便它能够具有不同的值。我想我可能会混淆迭代器和指针。我知道这auto基本上是类型推断,但仅此而已。
所以我的问题是,i如果向量中每个元素的地址都相同,那么它的值如何变化?
&i是局部变量的地址i。这不会改变。 *i取消对迭代器的引用,并返回该向量元素处的值。 &*i将返回一个指向向量中元素的指针。
所以你循环应该使用
std::cout << &*i << " ";
Run Code Online (Sandbox Code Playgroud)
查看地址更改。