结构体类型名和变量名以及离不开的typedef

结构体定义

结构体的定义如下所示,struct为结构体关键字,tag为结构体的标志,member-list为结构体成员列表,其必须列出其所有成员;variable-list为此结构体声明的变量。

 struct tag 
 { 
 member-list 
 } variable-list ;

在一般情况下,tag、member-list、variable-list这3部分至少要出现2个。

结构体类型名和变量名

首先来看一段代码:

 #include <iostream>
using namespace std;

struct Lnode
{
    int data; /* data */
};
struct
{
    int data; /* data */
} node;

这段代码定义了两个结构体,这两个结构体都满足结构体的定义,三部分都至少出现了两部分,那什么是结构体类型名和变量名呢?在结构体的定义里面我们可以看到所谓的tag即结构体类型名。而variable-list为结构体的变量名。可以这么记,括号前面的是类型名,括号后面的是变量名。

根据上面的代码可以了解到一个结构体可以没有类型名或者变量名但不能同时没有两种。

那如何使用结构体类型名和变量名呢?

在这里插入图片描述

通过上图可以看到我们通过类型名去直接使用结构体变量时出现了错误,而变量名使用结构体变量没有报错。所以,结构体里面是不能直接通过类型名去使用变量的。正确的定义如下:

正确的定义是这样的

首先我们应该通过类型名去定义一个新变量名L,然后通过L去调用结构体变量data。在c语言里我们使用struct Lnode L定义新的结构体变量L,而我这里没有写struct(这是个坏习惯),是因为vscode这里的Lnode隐指struct Lnode,所以就没有写,但我们要明白这里的Lnode就是stcrut Lnode。

结构体与typedef

什么是typedef?

typedef为现有类型创建别名,定义易于记忆的类型名。

什么意思呢?就是说我现在有一个变量名命名为abcd…xyz,总之就是名字很长,我不能用的时候每次都打26个字母吧,这真的是有点傻瓜。在不改变变量名的前提下,有什么办法呢?用typedef。我直接给abcd…xyz起个别名叫Abe Shinzō,是不是就短了很多。
明白了typedef是干什么的。再来说说typedef和结构体的关系。

typedef和结构体应用

还是先看代码:

#include <iostream>
using namespace std;

typedef struct Linklist
{
    int data; /* data */
} L;

int main()
{
    Linklist L1;
    L1.data = 5;
    L newL;
    newL.data = 666;
}

根据上面的知识我们了解到,Linklist是类型名,而L为变量名。我们来调用一下试试看对不对!
在这里插入图片描述
首先可以看到Linklist作为类型名定义一个新的变量名没有出错。来看变量名L,我焯,怎么报错了??? 根据上面的知识L不是变量名吗?为什么直接使用会出错呢?嘿嘿,你又年轻了,这里因为typedef的存在导致变量名不是变量名,而成为了类型名。我们把光标放在L上看看。
在这里插入图片描述
可以看到此处的L隐指的是typedef Linklist L,所以此处的L因为typedef的存在变成了typedef Linklist L的别名,也就是说L成为了缩减版的类型名。

搞清楚了类型名和变量名以及typedef在结构体里的意义,我们该如何调用呢?

#include <iostream>
using namespace std;

typedef struct Linklist
{
    int data; /* data */
} L;

int main()
{
    Linklist L1;
    L1.data = 23333;
    L newl;
    newl.data = 66666;
}

再来解释一下,这段代码里面Linklist为类型名,而L因为typedef的存在成为了struct Linklist的缩减版存在,所以L也是一个类型名。所以通过L newl 定义新的结构体变量名newl,然后再去使用结构体变量就不会出错啦。

好了,码字不易,我相信你一定可以看懂这篇文章。因为我真的懂了。


版权声明:本文为weixin_43420303原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。