我正在尝试创建一个称为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];
...
}
在这种情况下,您将获得一个指向学生的指针的引用(因此,如果您在调用者的站点中对其进行了修改,则可以在函数中进行修改)。当您分配它时,就像它已返回给呼叫者一样。
有时,您需要能够从一个函数返回多个事物。您要么构建一个包含事物的结构,然后返回该结构,但是这样做非常痛苦且通常效率不高,要么您只接受指向这些事物的指针(或引用),然后期望函数为您填充它们。根据我自己的经验,大多数时间都是这样做的。
编辑:从Tanveer Badar发表评论之后,最好的做法是期望该函数将返回值设置为0(或更好的nullptr)(如果未找到),因此您不必在调用者的网站上进行此操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句