提问人:DavidsDobriks 提问时间:9/29/2020 最后编辑:DavidsDobriks 更新时间:9/29/2020 访问量:435
使用参数返回指针的 C++ - 不同指针类型之间的比较缺少强制转换
C++ returning pointer using parameter - comparison between distinct pointer types lack a cast
问:
我正在尝试创建一个名为 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];
}
}
}
我只是对我应该返回什么以及如何返回感到有点困惑,并希望得到任何帮助!
答:
函数中的第二个参数说“指向指向Student
"
若要返回它,需要将其设置为指针 。
获取其中一个数组的指针是这样的:。Student
student
&student[i]
一旦你有了指针,你需要存储在某个地方,你将它存储在给定的指针到指针中,通过取消引用它,如下所示:*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];
...
}
在这种情况下,您正在获取指向 student 的指针的引用(因此,如果您在函数中修改它,则是从调用者的站点修改它)。当您分配它时,它就像返回给调用方一样。
为什么它很重要
有时,您需要能够从函数中返回多个内容。要么你构建一个包含这些东西的结构,然后你返回它,但这样做非常痛苦,而且通常效率不高,要么你只是接受指向这些东西的指针(或引用),并期望函数为你填充它们。根据我自己的经验,这是大多数时候所做的。
编辑:根据 Tanveer Badar 的评论,如果未找到,最好期望该函数将返回值设置为 0(或更好的 nullptr),这样您就不必在调用者的网站上执行此操作。
评论
*s
nullptr
您可以改为返回发生匹配的索引,如果没有匹配,则返回 -1。
int StudentsArray::find(int id){
for(int i = 0; i < studentsCount; ++i){
if(students[i]->getId() == id){
return i;
}
}
return -1;
}
评论
s == students[i]
-- 比较平等,而不是分配。此外,您将其标记为“按引用传递”,但这不是您向我们展示的代码中发生的事情。指针不是引用,而是一个值,因此您拥有的是按值传递的。==
*s
nullptr