【问题标题】:C using a pointer to a pointer to a struct [duplicate]C使用指向结构的指针的指针[重复]
【发布时间】:2018-11-03 01:21:24
【问题描述】:
typedef struct llist {
    int valor;
    struct lligada *prox;
} *LInt;

这就是我大学的 C 语言中链表的实现方式,我一直想知道为什么他们在最后一行中放置了指向 LInt 而不是 LInt 的指针。

typedef struct lligada {
    int valor;
    struct lligada *prox;
} LInt;

这不是更简单吗?我的意思是这是我在网络教程中看到的最后一个示例,如果我们想要一个指向该结构的指针,我们只需编写类似

LInt *foo = ...;

让我感到困惑的是,他们在结构中声明了指针,在练习中他们仍然做了上面的声明。这有什么特别的原因吗?这是正常的吗?他们也对二叉树这样做。

【问题讨论】:

  • 最好省略整个 typedef,只使用 struct:struct lligada *foo = ... ;
  • “这不是更简单吗?” --> 是的,而且不那么令人困惑。
  • 你的学校不太可能改变。有时大学会陷入困境,陷入困境,陷入困境,陷入困境。
  • 在您的第二个示例中,结构具有不同的标签,这是故意的吗?
  • 不,我只是忘记改了

标签: c


【解决方案1】:
typedef struct llist {
    int valor;
    struct lligada *prox;
} *LInt;

使LInt 等同于struct llist*(包括星号)。 在所有现代资源中都非常不鼓励这种类型定义指针的做法 在 C 上我遇到过,但它在历史上一直被使用过,尤其是 lcc 编译器 经常使用这种做法(他们的约定也将指针类型定义的名称大写)。

类型定义指针的问题在于它可能会令人困惑并且 您可以突然通过它们传递具有特殊值的 0(作为 NULL),但是如果您 有一个命名约定(例如将每个指针 typedef 大写)然后 星星实际上没有被隐藏,而只是表示为大写字母, 尽管对您的代码库不熟悉的人可能仍然会感到困惑。

总结一下,用

typedef struct llist {
    int valor;
    struct lligada *prox;
} *LInt;

然后你会像这样使用它:

LInt foo = NULL; 

而在 typedef 中没有星号时,上面将是:

LInt *foo = NULL; 

【讨论】:

  • 没有抱怨您的答案,但在标记为重复之后看到一个可发布的答案令人惊讶。
  • @chux 我很惊讶能够发布它。一定是比赛条件。
  • 我理解你的回答,但问题是即使使用 typedef 定义的结构和开始他们仍然使用星号进行声明,有什么理由吗?那不是用双指针吗?
  • @rybur 是的。如果他们添加另一个星,变量将是一个双重间接指针。
  • 那有用吗?还是不好?
猜你喜欢
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 2016-03-21
相关资源
最近更新 更多