typedef和自定义结构体类型

时间:2023-03-09 13:42:50

在自定义结构体类型时会用到typedef关键字.大家都知道typedef是取别名的意思,在C语言中跟它容易混淆的有const,#define等,其区别不在本篇文章讨论之列.

typedef和自定义结构体类型
/*定义单链表结点类型*/typedef char ElemType;     typedef struct dNode {//声明单链表结点类型     ElemType data;     struct dNode *next;    //指针域 }LNode, *LinkList; //定义此结构体变量struct dNode a或LNode a;定义此结构体的指针struct dNode *p或LNode *p或LinkList p都是没区别的 /*在链表的末端插入新的节点,建立链表*/
typedef和自定义结构体类型

注意点:

  1. 指针域定义了指向自己所在结构体类型的指针.这部分很容易错写,一种是漏写struct,要记住此时你声明next的时候typedef还没定义呢,哪来的dNode?如果不写struct,不管你是写dNode还是LNode结果都只有一种:后面根本编译不下去,错误一堆!此时还没定义完结构体呢!这也说明不能用LNode *next;总之要在结构体内定义指向自己的指针非得加上struct不可!
  2. 对于太多自学的人这条可能很有现实意义了.我相信有不少人会把指针域的dNode还}后的LNode连带最开头的dNode三个搞混.因为很多编程书上都给他们取一样的名字!好吧,如果照书上抄代码还没错.这里把struct dNode{}这部分看成整体,typedef就是给这个整体取别名的,我取的是LNode;与此同时给这个整体的指针取了LinkList作别名.
    因此我们就有我在注释里写的2种定义结构体变量和3种定义结构体指针的方式.
  3. 指针域那个是dNode不是后面的LNode,很简单后者只是别名,前者是真正的结构体名.如果你把这句写成struct LNode *next编译是能通过的,但是有潜在危机.定义完上述代码后,我又有了如下操作 LinkList p,head; head->next = p;   发现警告 warning C4133: “=”: 从“LinkList”到“LNode *”的类型不兼容!然后我将错写的struct LNode *next改回struct dNode *next就没警告了.

抱歉,我的代码注释太多了.初学者只是为了做笔记,请大家见谅.

文外话:

1.感谢<<C语言必须知道的300个问题>>的作者,本文涉及的问题在该书的第222和223,227(293页)都有详细阐述.读者如有疑问可自己再查阅该书,另外此书有PDF版.

2.本文作者有如下问题,请看到此博客的人帮帮我,在此不慎感激:

  • 请问单链表的结点可以是不同类型吗,比如结点1我写73,结点2我写e.
  • 请问结点可以是字符串吗,那如何定义呢,貌似C没有字符串类型变量,该用哪种标识符呢.
  • (见注释)我想在以后能方面的调用这个单链表,但它只是字符型的,请问怎么定义可以让它想是字符型就是字符想是整型就是整型,注意此问题跟第一个问题不同.

3.博客园这个编辑器我第一次用,这不习惯啊,那个自动保存后边的查看是个坑么,什么恢复内容开始结束的.搞得我文章一开始重复一大块.还有我的代码块怎么有两个复制啊,怎么删除呢.