C ++使用参数返回指针 - 不同指针类型之间的比较缺少强制转换

C++ returning pointer using parameter - comparison between distinct pointer types lack a cast

我正在尝试创建一个名为 void find(int id, Student** s) 的函数,该函数在数组中搜索具有参数 id 中指定的 id 的学生,以及 returns 学生指针使用参数 s。任务说我必须使用参数 return 此数据并且不使用 return 值。

我对最后一行的意思有点困惑。到目前为止我有这个但是 s == students[i] 行导致错误:不同指针类型“Student**”和“Student*”之间的比较缺少强制转换 [

void StudentsArray::find(int id, Student** s){
    for(int i = 0; i < studentsCount; ++i){
        if(students[i]->getId() == id){ 
            s=students[i];
        }
    }
}

我对我应该做什么感到有点困惑 return 以及我将如何去做,非常感谢任何帮助!

函数中的第二个参数表示“指向 Student 的指针”

要return它,你需要将它设置为Student的指针。 获取 student 数组之一的指针是这样完成的:&student[i].

一旦你有了指针,你需要存储在某个地方,你将通过像这样取消引用它来将它存储在给定的 pointer-to-pointer 中:*s

放在一起,你需要*s = &student[i]执行:“在s指向的内存区域存储student项的地址”

void StudentsArray::find(int id, Student** s){
    *s = nullptr;
    for(int i = 0; i < studentsCount; ++i){
        if(students[i]->getId() == id){ 
            *s = &students[i];
        }
    }
}

如果一开始这令人不安,只需删除一个间接层:

   void StudentsArray::find(int id, Student* & s) {
      ...
      s = &student[i];
      ...
   } 

在这种情况下,您正在获取指向学生的指针的引用(因此,如果您在函数内部修改它,您就是从调用者的站点修改它)。当您分配它时,它就像是 returned 给调用者。

为什么重要

有时,您需要能够从一个函数中 return 多个 事物 。要么你构建一个包含 things 的结构,然后你 return 但是这样做非常痛苦而且通常效率不高,要么你只是接受一个指向(或引用)的指针(或引用)这些 things 并期望函数为您填充它们。根据我自己的经验,这是大多数时候所做的。

编辑:根据 Tanveer Badar 的评论,如果没有找到,最好期望函数将 returned 值设置为 0(或更好的 nullptr),这样您就不必在来电者的网站。

您可以 return 匹配发生的索引或 -1 如果 none 匹配。

int StudentsArray::find(int id){
    for(int i = 0; i < studentsCount; ++i){
        if(students[i]->getId() == id){ 
            return i;
        }
    }
    return -1;
}