首页 > 解决方案 > 使用基于范围的 for 循环遍历指针列表

问题描述

今天是个好日子,

我一直在尝试使用以下代码将列表中的所有指针重置为 nullptr,如下所示:

    for (auto item : { ptr1, ptr2, ptr3 })
        item = nullptr;

问题是指针的副本是指向项目的,所以原始的ptr最后不等于nullptr。

我想获得对指针本身的某种引用,或者也许已经有更好的替代方法将容器中的所有指针设置为 nullptr。如果你们中的任何人碰巧使用 Qt,也许有一个在 Qt 中做这件事的好方法?提前致谢!

标签: c++qtpointers

解决方案


如果您要输入单个指针变量,为什么不直接使用链式赋值呢?

ptr1 = ptr2 = ptr3 = nullptr;  // All three pointers are nullptr.

演示


[...] 或者也许已经有更好的替代方法来将容器中的所有指针设置为nullptr.

如果与单独的命名指针变量相比,您将指针放在实际容器中,则可以使用基于范围的 for 循环来写入和读取容器的指针元素:

#include <array>
#include <ios>
#include <iostream>

// Container of 'pointer-to-const-int' elements.
using MyPointersArray = std::array<int const*, 3>;

void inspectNullptrness(const MyPointersArray& arr) {
    for (const auto& p : arr) {
        std::cout << std::boolalpha 
            << (p == nullptr) << " ";
    }
}

int main() {
    MyPointersArray pointers{nullptr, nullptr, nullptr};
    const int a = 42;
    inspectNullptrness(pointers); // true true true
    
    // Set pointers.
    for(auto& p : pointers) { p = &a; }
    inspectNullptrness(pointers); // false false false
    
    // Reset pointers.
    for(auto& p : pointers) { p = nullptr; }
    inspectNullptrness(pointers); // true true true
}

推荐阅读