【问题标题】:Pointers to structures as structure members指向作为结构成员的结构的指针
【发布时间】:2021-02-26 04:34:35
【问题描述】:

我正在完成 Sam 的 21 天自学 C 课程,但我遇到了一个我无法理解的代码 sn-p。这是第 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 的成员。这条附加线有什么意义?包含指向自身的指针的结构有什么好处?还是我只是在这里完全遗漏了什么?

【问题讨论】:

  • 也许看看接下来几天的活动?这看起来像是用于构建链表的设置。
  • 也许您忽略了更多任务? “正确”答案适用于链表中的节点
  • 没有任何意义的附加行除非这个结构将在某个时间用于动态托管数据结构(如链表)——不久的将来。
  • 是的,所以我也怀疑 - 你确定你没有错过问题中的任何关键内容吗?
  • 请不要将解决方案编辑到答案中。而是接受已发布的答案之一,或者您可以编写自己的答案

标签: c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    如果您将字符串定义为正确的 c 样式以 null 结尾的字符串,那么它当然最多只能为 20。否则您可以将 null 用于长度小于 21 的字符串,而避免将 null 用于长度为 21 的字符串 -你知道无论如何,在第 21 个字符之后就什么都没有了。

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多