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

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

提问人:DavidsDobriks 提问时间:9/29/2020 最后编辑:DavidsDobriks 更新时间:9/29/2020 访问量:435

问:

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

我对最后一行的意思有点困惑。到目前为止,我有这个,但是 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];
        }
    }
}

我只是对我应该返回什么以及如何返回感到有点困惑,并希望得到任何帮助!

C++ 数组指 强制转换 按值

评论

2赞 PaulMcKenzie 9/29/2020
s == students[i]-- 比较平等,而不是分配。此外,您将其标记为“按引用传递”,但这不是您向我们展示的代码中发生的事情。指针不是引用,而是一个值,因此您拥有的是按值传递的。==
0赞 Tanveer Badar 9/29/2020
即使您适应了上述更改,您的方法也无法指示不匹配。您应该设置为循环外。*snullptr

答:

0赞 xryl669 9/29/2020 #1

函数中的第二个参数说“指向指向Student"

若要返回它,需要将其设置为指针 。 获取其中一个数组的指针是这样的:。Studentstudent&student[i]

一旦你有了指针,你需要存储在某个地方,你将它存储在给定的指针到指针中,通过取消引用它,如下所示:*s

总而言之,您需要执行:“存储在 项目地址指向的内存区域”*s = &student[i]sstudent

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];
      ...
   } 

在这种情况下,您正在获取指向 student 的指针的引用(因此,如果您在函数中修改它,则是从调用者的站点修改它)。当您分配它时,它就像返回给调用方一样。

为什么它很重要

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

编辑:根据 Tanveer Badar 的评论,如果未找到,最好期望该函数将返回值设置为 0(或更好的 nullptr),这样您就不必在调用者的网站上执行此操作。

评论

1赞 Tanveer Badar 9/29/2020
它应设置为表示不匹配。*snullptr
0赞 Tanveer Badar 9/29/2020 #2

您可以改为返回发生匹配的索引,如果没有匹配,则返回 -1。

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