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的结构体,实现方法为“新名称 + 结构变量名”。


 

typedef struct用法详解与小结的更多相关文章

  1. 结构体定义 typedef struct 用法详解和用法小结

    typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,stru ...

  2. C/C++语法知识:typedef struct 用法详解

    第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定 ...

  3. 05typedef struct用法详解与小结

    1.基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef ...

  4. C语言typedef的用法详解

    C语言允许为一个数据类型起一个新的别名,就像给人起"绰号"一样. 起别名的目的不是为了提高程序运行效率,而是为了编码方便.例如有一个结构体的名字是 stu,要想定义一个结构体变量就 ...

  5. 基于typedef的用法详解【转】

    也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命 ...

  6. 1:CSS中一些@规则的用法小结 2: @media用法详解

    第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下     at-rule ...

  7. C语言对文件的操作函数用法详解1

    在ANSIC中,对文件的操作分为两种方式,即: 流式文件操作 I/O文件操作 一.流式文件操作 这种方式的文件操作有一个重要的结构FILE,FILE在stdio.h中定义如下: typedef str ...

  8. C++中的STL中map用法详解(转)

    原文地址: https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html C++中的STL中map用法详解   Map是STL的一个关联容器,它提供 ...

  9. 7-set用法详解

    C++中set用法详解 转载 http://blog.csdn.net/yas12345678/article/details/52601454 C++ / set 更详细见:http://www.c ...

随机推荐

  1. hdu4719 Oh My Holy FFF 线段树优化dp

    思路 好久之前的了,忘记什么题目了 可以到我这里做luogu 反正就是hdu数据太水,导致自己造的数据都过不去,而hdu却A了 好像是维护了最大值和次大值,然后出错的几率就小了很多也许是自己写错了,忘 ...

  2. Notepad++7.5.4 设置主题,使用插件

    首先官网下载 Notepad++7.5.4 默认英文转换成中文 下面设置主题: 设置-->语言格式设置 选择主题Obsidian,字体选择等宽字体Consolas,大小为11,选择全局字体,使用 ...

  3. springboot整合mybatis将sql打印到日志(转)

    在前台请求数据的时候,sql语句一直都是打印到控制台的,有一个想法就是想让它打印到日志里,该如何做呢? 见下面的mybatis配置文件: <?xml version="1.0" ...

  4. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏.     在过去,人们是要 ...

  5. 《重构网络:SDN架构与实现》Chapter7 SDN与网络虚拟化 随笔

    参考: <重构网络:SDN架构与实现>,作者:杨泽卫.李呈. Chapter7 SDN与网络虚拟化 结构 7.1 网络虚拟化 7.1.1 为什么需要网络虚拟化技术 7.1.2 网络虚拟化 ...

  6. C# ashx接收ContentType="text/xml"类型值

    public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain&qu ...

  7. python 将16进制转为字节

    数值为:0xFD >>> x="FD" >>> x.decode('hex') '\xfd'

  8. windows与kali双系统安装基本教程

    以前写过一篇在虚拟机中安装kali的基本教程的文章,那时候的kali还是1.0时代,现如今已经kali2.0了,在虚拟机中运行kali还是会受到性能的影响,所以还是装到自己电脑上跑起来最爽.当然如果你 ...

  9. C#中正确使用enum做Key的姿势

    C#中自定义enum,然后将其作为Dictionary的Key,通常的做法如下: using System; using System.Text; using System.Collections.G ...

  10. rabbitmq 消息的状态转换

    tutorial:http://www.rabbitmq.com/tutorials/tutorial-two-java.html 这里解释接收消息端关于 acknowledge和prefetch的设 ...