目录
常见的自定义类型(构造类型)都有:结构体、枚举、联合体,接下来我们一个一个来看,首先,我们先看结构体:
一、结构体
1.1结构的概念
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2结构的声明
下来我们用一个例子来看看结构的声明:
struct People //struct为结构体关键字,People为结构体标签名
{
char name[20]; //大括号里面是结构体的成员列表
char tel[20];
int age;
}; //注意:这里的分号不能省略
也可以用这种方式声明:
struct People //struct为结构体关键字,People为结构体标签名
{
char name[20]; //大括号里面是结构体的成员列表
char tel[20];
int age;
}p1,p2; //这里的p1,p2为变量列表(变量列表可以省略)
1.3 特殊的声明
即在声明结构的时候,可以不完全的声明。如下面的匿名结构体类型:它没有结构体标签名,只有变量列表。
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}*p;//这里为一个匿名结构体指针
int main()
{
p = &x; //等号两边的类型不兼容
return 0;
}
编译器会把上面的两个声明当成完全不同的两个类型,所以是非法的。
以上代码表明匿名结构体类型只能用一次,以后不能再继续使用。成员列表一样也会被认为是两种不同的类型。
1.4 结构的自引用
即自己类型的对象找到同类型的另外一个对象,就存储另外一个对象的地址。
struct Node
{
int data;//数据域
struct Node* next;//指针域
}
结构体的自引用不能省略结构体标签名。例:
typedef struct Node
{
int data;
struct Node* next;
}Node;
1.5 结构体变量的定义和初始化
结构体变量的3种创建方法:p1,p2,p3
,其中p1,p2
属于全局变量,p3
属于局部变量。
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
int main()
{
struct Point p3;
return 0;
}
结构体也可以在变量创建的同时进行初始化,如上面的代码就可以写成:
【注意】:结构体的初始化要用大括号{}
。
struct Point
{
int x;
int y;
}p1 = {
1,2}; //声明类型的同时定义变量p1
struct Point p2 = {
3,4}; //定义结构体变量p2
int main()
{
struct Point p3 = {
5,6};
return 0;
}
通过对上面代码的调试,我们可以清楚看到初始化情况。
- 如果是结构体里面包含结构体的情况又是怎么初始化的呢?我们一起来看一下下面的代码:结构体
S
里面包含结构体Point
。
struct Point
{
int x;
int y;
}p1 = {
1, 2 }; //声明类型的同时定义变量p1
struct Point p2 = {
3, 4 }; //定义结构体变量p2
struct S
{
double d;
struct Point p;
char name[20];</