我是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;
这是什么意思?
答案 0 :(得分:8)
简短版本:
typedef ListNode *ListNodePtr;
将ListeNodePtr
定义为指向ListNode的指针。
你可能想知道为什么星号是&#34;坚持&#34;到ListNodePtr
这里。这是因为在C声明中,作为一个指针被认为是一个类型修饰符,所以在一个声明中,它是声明符的一部分(变量的标识符或{{1 }}&#39; d type)。(*)只要在一行中有多个声明,这就是相关的,例如以下内容:
typedef
将定义一个指向int int *a, b;
的指针和一个简单的 int a
。
你可以把它写成
b
但是非常令人困惑,因为int* a, b;
仍然不是指针。
所有这一切,我个人认为坏样式到b
指针,因为作为C程序员,你知道星号的含义。将它隐藏在typedef
后面(并且在这里完成,将其替换为某些非标准后缀,例如&#34; Ptr&#34;)只会使代码更难以为其他人阅读。
(*)在此处添加了脚注:此设计背后的原因是声明应与用法相同。 typedef
取消引用指针,因此*a
也应声明指针。
答案 1 :(得分:2)
typedef struct listNode ListNode;
第一行表示ListNode
代表struct listNode
。
typedef ListNode *ListNodePtr;
第二行表示ListNodePtr
代表ListNode *
,它是指向ListNode
的指针。
答案 2 :(得分:1)
ListNodePtr
包含指向ListNode
的指针。因此,如果你解开typedef,它就是:struct listNode *
。