在指针和引用之间转换

时间:2013-03-18 01:59:51

标签: c++ pointers stl iterator

std::list<Value> stdList;

stdList.push_back(Value());

Value * ptr = &stdList.back(); // <-- what will this address point to?

如果我接受back()返回的引用并隐式将其转换为不太通用的Value *,它是指向列表的最后一个值,还是指向某个意外的位置?

有没有办法从指针创建迭代器,以便与erase()等std :: list函数一起使用?我认识到特定的泛型(迭代器到指针)比走向另一个方向更可行,但我想我还是会问。

2 个答案:

答案 0 :(得分:2)

指针将指向存储在容器内的值。引用做了同样的事情。

您无法直接将该指针转换为列表迭代器,因为您丢失了有关周围结构的所有信息。要做到这一点,你必须聪明地使用list::find

您尝试执行此操作有时是使用vector完成的。您可以将vector数据元素指针转换为迭代器(数组索引)的原因是因为您知道vector的结构。

请注意list::back() 返回迭代器。它返回一个引用。两者完全不同。你在想list::end()吗?或者你真的在迭代器和引用之间混淆了吗?因为可以从指针获取引用。你这样做:

Value& refval = *ptr;

答案 1 :(得分:1)

是,指针指向列表中存储的最后一个值。

我们不能从指针创建迭代器,迭代器是容器的概念(此处列表),而迭代器不关心列表中存储的值是什么类型。 引用和指针是存储在列表中的值的句柄,它们是可互换的,我们可以将引用转换为指针,反之亦然。