我正在 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
的成员。这条附加线的重点是什么?包含指向自身的指针的结构有什么好处?或者我只是在这里完全遗漏了什么?
答案 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 个字符之后就什么都没有了。