在C中使用指针的typedef

Ale*_*exa 2 c pointers typedef

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

这是代码的第一部分:

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

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

typedef struct listNode ListNode;
typedef ListNode *ListNodePtr;
Run Code Online (Sandbox Code Playgroud)

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

typedef ListNode *ListNodePtr;
Run Code Online (Sandbox Code Playgroud)

那是什么意思?

小智 10

精简版:

typedef ListNode *ListNodePtr;
Run Code Online (Sandbox Code Playgroud)

定义ListeNodePtrListNode指针.

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

int *a, b;
Run Code Online (Sandbox Code Playgroud)

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

你可以把它写成

int* a, b;
Run Code Online (Sandbox Code Playgroud)

但那会混乱,因为它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`不为空在尝试之前。 (2认同)