代码之家  ›  专栏  ›  技术社区  ›  Brett

通过引用传递双指针

  •  0
  • Brett  · 技术社区  · 5 年前

    我收到一个错误,说我的表达式必须有一个指向类型类的指针,我试图动态地将一个指针数组分配给一个对象向量。

    void dmaArr(Record*** sortedRec, vector<Record> records) {
        //sortedRec = nullptr;
        *sortedRec = new Record *[records.size()];
        cout << *sortedRec << endl << sortedRec << endl;
        for (int i = 0; i < records.size(); i++) {
            *sortedRec[i] = &records[i];
            cout << sortedRec[i]->name << '\t' << &sortedRec[i]->name << endl;
        }
    
    2 回复  |  直到 5 年前
        1
  •  2
  •   1201ProgramAlarm    5 年前

    在你的 cout 声明, sortedRec[i] 具有类型 Record** ,不能与指针解引用运算符一起使用。您可以使用 (*sortedRec[i])->name 获取刚刚分配的记录的名称字段。

    顺便说一句,因为你经过 records 按值计算,存储在for循环中的所有指针都指向这个临时对象,一旦函数返回,这些指针将处于危险状态。你应该通过 记录 通过引用: vector<Record> &records 为了避免这种情况。

        2
  •  1
  •   Remy Lebeau    5 年前

    sortedRec 是a Record*** ,所以 sortedRec[i] 是a Record** .你不能用 -> 运算符,用于取消指针对指针的引用。你需要使用 * 操作符改为取消引用 记录** 指针指向单个指针 Record* 指针,就像你在你的 for 循环。然后,您可以使用 -> 操作员取消引用 记录* 访问成员的指针 Record 实例,例如:

    cout << (*sortedRec[i])->name << endl;
    

    话虽如此,在C++中,你很少需要像现在这样使用3级间接性( Record*** sortedRec ).

    不管怎样 sortedRec 通过, records 应通过引用传递,以便 dmaArr() 不按 复制 呼叫者的 vector<Record> ,离开 sortedRec 复制 在以下情况下被销毁 dmaArr() 出口:

    void dmaArr(..., vector<Record> &records)
    

    然后,你可以 并且应该 替换上的一级指针间接性 sortedRec 通过使用引用而不是指针:

    void dmaArr(Record** &sortedRec, vector<Record> records) {
        sortedRec = new Record *[records.size()];
        for (size_t i = 0; i < records.size(); ++i) {
            sortedRec[i] = &records[i];
            cout << sortedRec[i]->name << endl;
        }
        ...
    }
    
    vector<Record> records;
    Record** sortedRecords;
    
    // populate records as needed...
    
    dmaArr(sortedRecords, records);
    
    // use sortedRecords as needed...
    
    delete [] sortedRecords;
    

    然后,你可以 并且应该 替换上的另一层指针间接性 sortedRec 通过使用 std::vector 而不是 new[] .让 std::矢量 为您管理动态内存,特别是因为调用者已经在使用 std::矢量 无论如何:

    void dmaArr(vector<Record*> &sortedRec, vector<Record> &records) {
        sortedRec.resize(records.size());
        for (size_t i = 0; i < records.size(); ++i) {
            sortedRec[i] = &records[i];
            cout << sortedRec[i]->name << endl;
        }
        ...
    }
    
    vector<Record> records;
    vector<Record*> sortedRecords;
    
    // populate records as needed...
    
    dmaArr(sortedRecords, records);
    
    // use sortedRecords as needed...
    
    推荐文章