指向结构作为结构成员的指针

时间:2021-02-26 04:34:35

标签: c

我正在 21 天内完成 Sam 的 Teach Yourself C,但遇到了一个我无法理解的代码片段。这是第 11 天练习 6 的任务。任务是“为名为 data 的结构类型编写定义,该结构类型最多可包含 20 个字符的字符串。”我的解决方案是

struct data{
    char a[21];
};

笨拙地使用结构,但没关系。我的虚拟代码编译并产生了预期的结果 21

#include <stdio.h>

struct data{
    char a[21];
} data_inst;

int main(void)
{
    printf("%lu\n", sizeof(data_inst.a));

    return 0;
}

然而,书中给出的答案是

struct data{
    char a[21];
    struct data *ptr;
};

我对正确答案的解释是 ptr 是指向 data 类型的指针。但 ptr 也是 data 的成员。这条附加线的重点是什么?包含指向自身的指针的结构有什么好处?或者我只是在这里完全遗漏了什么?

2 个答案:

答案 0 :(得分:1)

结构中的指针用于存储下一个结构的地址,它通常用于链表中,我们要在其中存储下一个节点的地址,以便连接。您可以搜索链表,您将获得链表如何工作的详细信息,根据您的代码,不需要struct data *ptr,因为您只需要制作一个20个字符的结构。对于您的问题,struct data *ptr 的用途是什么,您可以参考链表。

答案 1 :(得分:-1)

指针不是指向这个结构,而是指向这个类型的结构。当然它可以指向自身,但它也可以指向同一结构体类型的另一个实例。

因此您可以保留或指向 data 的第一个实例,如有必要,它可以反过来指向另一个实例,依此类推。这将允许您在一个这样的实例中保留最多 20 个字符(或牺牲空字符串终止,明确地最多 21 个),但使用多个实例来: 1/ 在多个实例中存储超过 21 个字符的字符串 2/ 存储最多 21 个字符的字符串列表或堆栈

如果你将字符串定义为适当的c风格空终止字符串,那么当然它最多只能是20个。否则你可以对长度小于21的字符串使用null,并避免对长度为21的字符串使用null -你知道无论如何在第 21 个字符之后就什么都没有了。

相关问题