为何操作C++迭代器必须使用解引用运算符*?以string迭代器为例
关于C++迭代器解引用的问题解答
先看你的代码和运行结果:
#include <iostream> #include<string> using std::string; using namespace std; int main() { string s("some string"); *s.begin() = toupper(*s.begin()); std::cout << s << std::endl; }
运行结果:
Some string
为什么必须用*s.begin()?不能直接用s.begin()?
首先得搞清楚迭代器的本质:迭代器是个指向容器元素的"位置标记",就像指针一样——它存的是元素在内存里的位置,不是元素本身。
s.begin()返回的是指向string第一个字符的迭代器,这个迭代器本身不是字符's',只是告诉程序"第一个字符的位置在这儿"。
从
toupper的参数要求来看:toupper需要的是一个字符(准确说是对应ASCII值的int类型),如果直接传s.begin(),相当于传了一个迭代器对象,和toupper需要的参数类型完全不匹配,编译器直接报错。必须用*解引用迭代器,才能拿到它指向的实际字符's',传给toupper做处理。从赋值逻辑来看:
*s.begin()拿到的是原字符串第一个字符的引用,给它赋值就等于直接修改原字符串里的那个字符。如果写成s.begin() = toupper(...),左边是迭代器(位置标记),右边是toupper返回的字符,你没法把一个字符赋值给一个位置标记,类型不兼容,同样会编译报错。
指针是不是仅用于节省内存?
当然不是。指针(包括迭代器这种指针的抽象)的核心作用是间接访问内存中的数据,让你能通过"位置标识"去操作实际存储的内容。比如遍历数组、修改字符串或容器元素时,指针/迭代器是灵活操作数据的基础工具,和节省内存没有关系。
内容的提问来源于stack exchange,提问作者jacky chong
相关产品推荐
相关产品推荐

