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

问题描述

我正在尝试创建一个称为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)(如果找不到),因此您不必在调用者的网站上进行操作。

,

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

#creating variable based off column value
value = eps.select('value').collect()[0]

#attempting to lit the variable to create an entire column of just this variables output
dfall = dfall.withColumn('test',lit(col(value)))