int *p = container.data(); // 假設指向容器內部數組
for (; p != nullptr; ++p) { // 錯誤:p 永遠不會為 nullptr
// 使用 *p
}
指針 `p` 初始指向有效內存地址(非 `nullptr`),`++p` 只會遞增地址,永遠不會變為 `nullptr`**。循環條件 `p != nullptr` 永真,導致越界訪問,直到段錯誤。
for (size_t i = 0; i < container.size(); ++i) {
auto &elem = container[i];
}
for (auto it = container.begin(); it != container.end(); ++it) {
auto &elem = *it;
}
for (auto &elem : container) {
// 直接使用 elem
}
int *begin = container.data();
int *end = begin + container.size(); // 尾後指針
for (int *p = begin; p != end; ++p) {
// 使用 *p
}
C++ 標準庫約定:**`end()` / `data()+size()` 指向「最後一個元素之後」的位置**,不解引用,僅作邊界哨兵。循環條件永遠是 `it != end` 或 `p != end`。
**現代 C++ 盡量不直接裸指針遍歷,擁抱迭代器與范圍 for,安全又高效。**