【C语言】typedef struct 和 struct 使用区别

本文详细介绍了C语言中的typedef关键字,以及它如何与struct结合使用为数据类型创建别名。讨论了typedef与#define的区别,并展示了在结构体中如何使用typedef避免自我引用的问题。同时,讲解了struct在代码中的两种常见形式:结构体类型定义和结构体变量定义,并对比了C++中struct的处理方式。
摘要由CSDN通过智能技术生成

目录

1. 什么是 typedef ?   

1.1 typedef为C语言的关键字

1.2 在编程中使用typedef目的

1.3 typedef最简单的应用——为已知数据类型命名

1.3.1  typedef vs #define

1.4 typedef与结构结合使用

1.4.1 定义一个新的结构类型

1.4.2 typedef为这个新的结构起了一个名字,叫MyStruct

1.4.3 C语言不允许在结构中包含指向它自己的指针吗?

2. struct在代码中常见两种形式

2.1 结构体类型定义

2.2  结构体变量定义

3. struct在C++的定义


1. 什么是 typedef ?   

1.1 typedef为C语言的关键字

C 语言提供了 typedef 关键字,可以使用它来为类型取一个新的名字。这里的数据类型包括内部数据类型(int,char等)自定义的数据类型struct等);

1.2 在编程中使用typedef目的

一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明

1.3 typedef最简单的应用——为已知数据类型命名

typedef unsigned char my_byte;

上面的含义是给已知数据类型unsigned char起个新名字,叫my_byte。typedef相当于给unsigned char起了一个别名。

my_byte b1, b2;

1.3.1  typedef vs #define

#define 是 C 指令,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:

typedef 仅限于为类型定义符号名称#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。

typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。

1.4 typedef与结构结合使用

typedef struct tagMyStruct
{ 
 int iNum;
 long lLength;
} MyStruct;

MyStruct xiaoming;

 这语句实际上完成两个操作:

1.4.1 定义一个新的结构类型

struct tagMyStruct
{ 
 int iNum;
 long lLength;
} 

分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct tagMyStruct varName来定义变量,但要注意,使用tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

1.4.2 typedef为这个新的结构起了一个名字,叫MyStruct

typedef struct tagMyStruct MyStruct;

因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。

MyStructstruct tagMyStruct

若struct tagMyStruct{}这样来定义结构体的话。在申请tagMyStruct的变量时,需要这样写,struct tagMyStruct n; 若用typedef,可以这样写,typedef struct tagMyStruct{}TagMyStruct; 。在申请变量时就可以这样写,TagMyStruct n; 区别就在于使用时,是否可以省去struct这个关键字。

1.4.3 C语言不允许在结构中包含指向它自己的指针吗?

typedef struct tagNode
{
 char *pItem;
 pNode pNext;
} *pNode;

首先C语言允许在结构中包含指向它自己的指针,但typedef struct tagNode {} *pNode;结构体声明通过上述介绍实际上进行了两步;第一步是建立结构体类型struct tagNode {}但实际上建立的过程中就遇到了pNext域的声明,其类型是pNode,因为pNode表示的是新类型的名字,由于在类型本身还没有建立完成之前这个类型的新名字实际上并不存在,故编译器无法识别pNode。

解决上述问题的方法如下:

typedef struct tagNode 
{
 char *pItem;
 struct tagNode *pNext;
} *pNode;
typedef struct tagNode *pNode;
struct tagNode 
{
 char *pItem;
 pNode pNext;
};

注意:在这个例子中,用typedef给一个还未完全声明的类型起新名字。C语言编译器支持这种做法。

2. struct在代码中常见两种形式

struct在代码中常见的两种形式如下,这是两个完全不同的用法,即:

2.1 结构体类型定义

意思是:定义{}中的结构为一个名称是“A”的结构体。 

struct A 
{ 
//... 
};

这种用法在typedef中一般是: 
typedef struct tagA //故意给一个不同的名字,tagA作为结构体的实名 

//... 
} A; //结构体的别名。 

2.2  结构体变量定义

struct 
{ 
//... 
} A; 

以{}中的结构,定义一个名称为"A"的变量。这里的结构体称为匿名结构体是无法被直接引用的。 
也可以通过typedef为匿名结构体创建一个别名,从而使得它可以被引用: 
typedef struct 

//... 
}

3. struct在C++的定义

在c++中如果用typedef的话:

struct Student
{
int a;
}stu1;//stu1是一个变量

stu1是一个变量使用时可以直接访问stu1.a

typedef struct Student2
{
int a;
}stu2;//stu2是一个结构体类型

stu2是一个结构体类型使用时则必须先 stu2 s2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米杰的声音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值