文章目录
- 分类判断
- 结构体成员的使用
- typedef
分类判断
struct tag
{
char m;
int i;
}p;
假设定义了上面这一个结构体,tag 就是类型名, p 就是变量名, m 和 i 就是结构体成员列表。
可以这么记,括号前面的是类型名,括号后面的是变量名。
一般情况下,类型名,变量名,结构体成员至少需要两个才能构成结构体。
结构体成员的使用
int main()
{
tag.i = 123;
p.i = 123;
return 0;
}
通过上图可以看到我们通过类型名去直接使用结构体变量时出现了错误,而变量名使用结构体变量没有报错。所以,结构体里面是不能直接通过类型名去使用变量的。正确的定义如下:
int main()
{
struct tag s;
s.i = 123;
return 0;
}
这是main函数中,我们使用struct tag s定义了一个结构体变量s,并给它的成员变量i赋值为123。另外,还有一个全局的结构体变量p,也给它的成员变量i赋值为123。
typedef
typedef为现有类型创建别名,定义易于记忆的类型名。
它的作用说在不改变变量名的前提下,用typedef。给结构体起个别名,往往可以用在原来变量名很长的情况下
现在我们尝试运行下下面的代码
typedef struct tag
{
char m;
int i;
}p;
int main()
{
struct tag s;
s.i = 123;
p.i = 123;
return 0;
}
我们会发现两个情况
- s被成功定义了
- 原来可以的变量名p不可用了
原因是s虽然被成功定义了,但是p因为typedef的存在导致变量名不是变量名,而成为了类型名。我们把光标放在p上看看。
可以看到此处的p隐指的是typedef struct tag p,所以此处的L因为typedef的存在变成了typedef struct tag p的别名,也就是说p成为了缩减版的类型名。
当然,这也是有解决方法,只要把p当成变量名使用就行了,具体情况如下
typedef struct tag
{
char m;
int i;
}p;
int main()
{
struct tag s;
s.i = 123;
//p.i = 123;
p d;
d.i = 123;
return 0;
}
好了,这就是全部了,这篇博客是我从别人那里借鉴的学习笔记,大家可以看看那个大佬的
链接: link