2021-08-21 对typedef结构体指针取别名的理解

typedef是类型定义的意思。

typedef struct 是为了使用这个结构体方便。
具体区别在于:
(1)若struct node { }这样来定义结构体的话。在申请node 的变量时,需要这样写,struct node n;
(2)若用typedef,可以这样写,typedef struct node{}NODE; 。在申请变量时就可以这样写,NODE n;

区别就在于使用时,是否可以省去struct这个关键字。

struct 结构名 {
…类型 变量名;
…类型 变量名;
… } 结构变量; // 这里是变量

typedef struct 结构名 {
…类型 变量名;
…类型 变量名;
… } 结构别名;

节点的构造:

typedef struct Node
{
    int data; //数据域,用来存放数据域;
    struct Node *pNext; //定义一个结构体指针,指向下一次个与当前节点数据类型相同的节点
}NODE,*PNODE;
 
int main()
{
	//struct Node stu1;
	NODE stu1;
	
	//struct Node *a;
	PNODE a = &stu1;
}

对节点构造的理解
1、struct Node{ }:定义了一种数据类型叫struct Node

2、struct Node{ }NODE:给struct Node类型起别名叫NODE类型;

3、struct Node{ }*PNODE
(3.1)、定义了一种指针类型struct Node{ }*
(3.2)、把指针类型struct Node{ }*取别名叫PNODE(同样表示一种指针类型,但不是变量!);
(3.3)、后期使用别名定义指针变量 PNODE a = &stu1,等同于struct Node{ } * a = &stu1;
(3.4)、如果没有给指针类型取别名,只定义了struct Node{ }NODE不能指直接 PNODE a = &stu1,在定义结构体指针变量时要写成:

struct Node * a = &stu1;
或者
NODE * a = &stu1

.
.
.
.
补充内容:在C++中这是一个风格问题。

typedef struct {
… .//content
} SA, *SpA;

如果typedef成SA时,在定义struct对象指针的时候可以写成:
  SA *pParam;
如果typedef成*SpA时,在定义struct对象指针的时候可以写成:
  SpA pParam; //也就是SA* pParam;

别看SA *pParamSA* pParam一样,只是“*”号位置换了一下,虽然说只是风格问题,但在实际理解上是有区别的!
  “*”号紧挨着变量名之前(SA *pParam)标识定义的是一个struct变量的指针,此时也就是上述typedef成SA的原因;
  “*”号紧挨着类型名之后(SA* pParam)表示定义的是一个struct指针的变量,此时也就是上述typedef成*SpA

你可能感兴趣的:(C/C++专栏)