一、结构是什么,我们为什么需要结构?
先说结论:结构其实是一种我们自定义的类型,或者你也可以将其看作是一种超级数组。
和char、short、int一样,结构也只是一种数据类型。但它相较于系统给定的其它类型,它具有它的特殊性。
我们知道,如果我们要存放一个人的名字,可以用char类型的数组来存放。
要存放一个人的年龄,可以用short或int类型的变量来存放。
但如果我想一次性把年纪和名字存放在一起该怎么做呢?
结构应运而生。
结构的特殊性在于:它可以同时存放很多种不同类型的数据。它的功能很像数组,不过是超级数组。
数组可以存放很多数据,不过只能存放同类型的数据。
结构也可以存放很多数据,且可以是不同类型的。
二、我们先来看看结构的声明:
struct People
{
char name[20];
short age;
};
上面就是结构的声明,该声明描述了一个由1个char类型的数组和1个short类型的变量组成的结构。
struct为关键字
People为结构的标记
这个声明就是一个模板,有了这个模板,后面我们就可以把它当做数据类型来创建这个数据类型的变量。
从本质上看,People结构声明创建了一个名为struct People的新类型。
注意,声明结构的时候,编译器此时并未为它开辟空间。它的空间要等到定义结构变量时才分配。
三、定义结构变量的3种方法:
1、声明与定义分开
//建立结构声明
struct People
{
char name[20];
short age;
};
//定义结构变量
struct People Jack;
上面最后一条代码的含义是:
- 创建了一个结构变量
- 变量名是Jack
- 变量的结构布局是People
此时编译器会为Jack分配空间。
2、声明与定义一起
我们也可以把结构的声明和定义放在一起。声明的同时,也定义了结构变量。
//建立结构声明
struct People
{
char name[20];
short age;
}Jack;//定义了一个结构变量 --
3、直接定义结构变量
另外,我们甚至可以直接不要结构标记,如:
struct
{
char name[20];
short age;
}Jack;//定义了一个结构变量 -- Jack
但省去标记的代价是:这个结构我们只能用一次,以后再也用不了了。
原因也很容易理解:你都没有标记了,你以后再想创建变量时,该如何表示它呢?
所以如果你想多次使用一个结构,就要采用带标记的形式(或者使用typedef来定义一个结构)。
到这,结构的声明与定义就结束了。