随笔 - 363, 文章 - 0, 评论 - 2, 阅读 - 23万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

05typedef struct用法详解与小结

Posted on   心默默言  阅读(291)  评论(0编辑  收藏  举报

1.基本解释

typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

在编程中使用typedef的目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。至于typedef有什么微妙之处,我将具体根据以下几个问题展开阐述。

2. typedef和结构的问题

当使用下面的代码定义一个结构时,编译器会报告一个错误,为什么呢?莫非C语言不允许在结构中包含指向它自己的指针吗?请看下文说明:

typedef struct tagNode {
    char     *pItem;
    pNode    pNext;    
} *pNode;
推理与分析:
(1) typedef的最简单使用:typedef long byte_4; 给一直数据类型long起个新名字,叫做byte_4;
(2) typedef与结构结合使用;
typedef  struct  tagMyStruct {
    int    iNum;
    long   lLength;
} MyStruct;
这句话实际上完成了两个操作:
第一,定义了一个结构类型:
struct  tagMyStruct  {
    int    iNum;
    long   lLength;
};
分析:tagMyStruct被称为“标签”(或结构标识符),是该结构体类型,struct关键字和tagMyStruct一起,构成了这个新的结构体。
第二,typedef为这个新的结构起了一个名字,叫做MyStruct,即typedef struct tagMyStruct MyStruct;
此时,MyStruct在功能上与struct tagMystruct等价。例如,当需要创建一个名称为varName,类型为tagMyStruct的结构体是,可以使用如下两种方法:
方法一:struct + 类型名称 + 结构体变量名称
struct tagMyStruct varName;
方法二:新名称 + 结构体变量名称
MyStruct varName;
答案与分析:
C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字还尚不存在,也就是说在这个时候,编译器根本就不认识pNode。那么,要解决这个问题的方法就有多种,如下:
复制代码
复制代码
// 方法1:    
typedef struct tagNode{
    char  *pItem;
    struct tagNode  *pNext;
} *pNode;

// 方法2:
typedef struct tagNode *pNode;
struct tagNode{
    char  *pItem;
    pNode  pNext;
};
/* 注意:在这个例子中,你用typedef给一个还未完全声明的结构类型起新名字,C语言编译器支持这种做法。*/
复制代码
复制代码
struct在代码中常见的形式有两种:
复制代码
复制代码
// 第一种:
struct A {
    ……
};

// 第二种:
struct {
    ……
} A;
复制代码
复制代码
这是两种完全不同的用法:
后者是定义结构体变量,意思是:定义一个名称为“A”的结构体变量。这里的结构体称之为匿名结构体,是无法被直接引用的。为了使该匿名结构体能够被引用,可以通过typedef为其创建一个别名,从而使得它可以被应用,实现方法如下:
typedef struct {
    //……
} A;    //定义匿名结构体的别名为A
注意结构类型和结构变量名的区别:结构类型该结构体的类型,结构变量名是一个变量名称,但变量的类型是该结构体类型。对于结构类型已知的结构体,我们能够通过“struct + 结构类型 + 结构变量名;”的方法来声明新的结构变量,而未定义类型的结构体则不能直接进行新的结构变量的定义。例如,现在我要在某函数中声明一个结构变量名为SHZ的结构体,若结构名已知,则可通过语句:struct + 结构类型 + SHZ;的形式来声明。对于结构类型未知的结构体,则需要通过使用typedef为该结构体起一个新的名字,然后才能利用该结构别名来声明一个结构变量名为SHZ的结构体,实现方法为“新名称 + 结构变量名”。
https://blog.csdn.net/u013632190/article/details/47720703

 
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示