【问题标题】:How to return NULL pointer and a pointer to an element of an array of structures from a function?如何从函数返回 NULL 指针和指向结构数组元素的指针?
【发布时间】:2020-11-12 08:05:52
【问题描述】:

我是 C 和整体编程的初学者。

我有以下功能: Students* printGrades(),它是指向结构 Student 和结构数组 Students student[32] 的类型指针。假设该结构包含有关学生姓名、ID 和成绩的数据。

正如任务所述,它应该返回一个 NULL 指针或一个指向具有最高成绩的学生的指针(我猜它是指一个元素,即姓名、ID、1 名学生的年级),具体取决于特定条件.假设我已经对数组进行了排序,因此最高学生的数据(姓名、ID、年级)位于顶部。

所以我面临的挑战是我真的不知道如何退货。我所做的是:

if (a condition) {
    return NULL;
} else {
    return student;
}

我只是返回了 NULL 或学生(我需要数组中第一个学生的数据,我只是返回了student,因为在这种情况下,只返回第一个元素,我认为这已经足够了这样,因为函数本身就是一个指针)。但是,正如我的导师所说,这是错误的(特别是 2 个返回命令),他没有给我任何提示(尽管他没有教过)。我在互联网上查找了它,但找不到执行此操作的方法 - 它们要么不合适,要么我们还不允许使用复杂的方法。

那么,你能告诉我如何返回一个 NULL 指针和一个指向一个学生的指针

【问题讨论】:

  • 如果分数最高的学生是N,则返回&student[N]。如果任何条件为真(也许你应该告诉我们哪一个?)返回 NULL。您不能返回 NULL 指向学生的指针,只能返回 NULL 指向学生的指针。
  • 顺便说一句:return student 等价于return &student[0]
  • 是的,当然我不能同时退回它们,我只是将这两个条件都考虑在内(因此我说“和”)。但是,我实际上做了和你写的完全一样的事情

标签: c pointers struct


【解决方案1】:

Student*(指向值的指针)和Student(值)是 C 中的两种不同类型。您的学生数组定义为Students student[32],这意味着其中的每个元素都是Student 类型。如果你将它定义为Students *student[32],那么它的每个元素都是Student*,但这可能不是你需要的。

现在指针 (Student*) 可以指向某个值。它也可以不指向任何东西,在这种情况下它是 NULL。

另一方面,值 (Student) 始终存在。不能为 NULL。

让我们看看你的数组。假设您发现成绩最高的学生在数组中的位置i,即student[i]

当从函数返回student[i] 时,您会返回按值,这意味着您实际上创建了一个学生副本并将其返回。

你想要的是通过引用返回,即只返回指向学生的指针,而不是真正复制它的值。

因此,为此您使用运算符 &。你做的是return &student[i]

/* Here you find the 'i' of the student with the highest grade */
if (/*a condition*/) {
    return NULL;
} else {
    return &student[i];
}

【讨论】:

  • 非常感谢,您的解释很清楚,我更正了我的代码。我想我还没有完全理解指针。顺便说一句,有些人在最后说 [i] 没有必要返回学生的第一个元素。只是好奇,我写“return &student”可以吗?
  • 也许我误解了你最初的问题。如果您想返回 FIRST 学生,那么可以。您可以使用return studentreturn &studentreturn &student[0] - 这些是等效的(嗯,几乎,有一些区别,但在你的情况下它们是相同的)。数组的名称隐含地指向数组中第一个元素的指针,因此它是有效的。
【解决方案2】:

这是一个执行类似功能的小函数。它避免了一些惯用的 C 结构。您应该能够将其应用于您的问题。

/*-
     struct S *NewS(void) - return a new S; null if exhausted.
 */
#define NS 100
static struct S Stab[NS];
static int  sp;

struct S *NewS() {
    struct S *s;
    if (sp < NS) {
        s = Stab + sp;
        sp += 1;
    } else {
        s = NULL;
    }
    return s;
}

【讨论】:

    【解决方案3】:

    指针的值是它指向的对象的地址或NULL

    对于您的问题,只需返回学生的地址,如下所示:return &amp;student;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-30
      • 2016-04-21
      • 2021-06-25
      • 1970-01-01
      相关资源
      最近更新 更多