【问题标题】:typedef with pointer in C [duplicate]带有C中指针的typedef [重复]
【发布时间】:2016-01-16 06:36:52
【问题描述】:

我是 C 编程的初学者,我正在学习链接列表。 我正在尝试创建一个链接列表,它将以正确的顺序显示字母。该程序使用户能够按字母顺序在列表中插入一个字符或从列表中删除一个字符。 所以,我举了一个例子,但有一些我无法理解。

这是代码的第一部分:

#include <stdio.h>
#include <stdlib.h>

struct listNode {
    char data;
    struct listNode *nextPtr;
};

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;

在那部分之后,程序从函数原型开始。 我知道底部第二行中typedef 的用法。 但我不知道的是,代码的最后一行包含:

typedef ListNode *ListNodePtr;

这是什么意思?

【问题讨论】:

  • 请参阅Is it a good idea to typedef pointers? 以获得关于最后一行无益的强烈建议。至少在您的情况下,它清楚地包含名称中的Ptr,但* 也与Ptr 一样清晰。
  • 我总是想知道对于带有Ptr 或类似名称的类型名的后缀/前缀有什么好处,而不是仅仅将* 放在类型名的前面。后者更加明确,并且对命名空间的污染更少,如果你因此会使用它(如果不是,它有什么好处呢?)。
  • @Olaf 我猜我们几天前也进行了类似的讨论,并且有 一个 可能很好地使用 typedef 指针,即客户端代码获取它作为一个不透明的句柄,真的不应该知道它一个指针。 (例如,因为它可以在以后的版本中更改为 int 而不会在 API 中引入重大更改)当然,这是一个极端情况,当然您不会使用 @987654334 @后缀然后...
  • @FelixPalmen:History repeating。它每隔几周就会出现在这里。但我实际上也反对这样的指示。注意这里不包括 opaque/typedefed structs ,非常有用。
  • @Olaf 很喜欢这首歌,很久以前...我仍然不严格反对,在某些情况下您需要 不透明的句柄 并使其成为指针可能是一个实现细节。但在一般情况下,typedefing 指针确实是一个禁忌 :)

标签: c pointers typedef


【解决方案1】:

短版:

typedef ListNode *ListNodePtr;

ListeNodePtr定义为指向ListNode的指针

您可能想知道为什么这里的星号“粘”在ListNodePtr 上。这是因为在 C 声明中,指针被认为是类型修饰符,所以在声明中,它是 declarator 的一部分(变量的标识符或typedef'd 类型)。(*)只要您在一行中有多个声明,这就是相关的,例如以下:

int *a, b;

将定义一个 指向 int a 的指针和一个普通的 int b

你可以写成

int* a, b;

但这会非常令人困惑,因为b 仍然不是是一个指针。

话虽如此,我个人认为typedef 是指针不好的风格,因为作为C 程序员,你知道星号的含义。将它隐藏在 typedef 后面(就像这里所做的那样,用一些非标准的后缀代替它,比如“Ptr”)只会让其他人更难阅读代码。

(*) 在此处添加脚注:此设计背后的原因是声明应该与用法相同。 *a 取消引用一个指针,所以*a 也应该声明一个指针。

【讨论】:

  • 并添加到您的脚注:当 typedef 类型是结构类型时,ListNode *ptr 告诉您使用 ptr-&gt;nextPtr 而不是生硬但有效的(*ptr).nextPtr,或者稍微更多复杂的表达式,ptr-&gt;nextPtr-&gt;data 而不是 (*(*ptr).nextPtr).data 等。当然,在尝试之前,你会检查 ptr-&gt;nextPtr 不为空。
  • @JonathanLeffler 是的,这就是我在这个答案中的 opinion 所追求的......明确指出。感谢您为其添加更多推理。
【解决方案2】:
typedef struct listNode ListNode;

第一行表示ListNode 将代表struct listNode

typedef ListNode *ListNodePtr;

第二行表示ListNodePtr 将代表ListNode *,它是指向ListNode 的指针。

【讨论】:

    【解决方案3】:

    ListNodePtr 持有指向ListNode 的指针。因此,如果您解开 typedef,它的缩写是:struct listNode *

    【讨论】:

      猜你喜欢
      • 2020-03-21
      • 2011-11-29
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多