文章目录
自定义类型:结构体,枚举,联合
1.结构体
1.1结构体的声明
结构的基础知识:
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
复杂对象
人:名字+年龄+身高+体重+身份证号+电话
书:书名+作者+出版社+定价+书号
结构的声明:
struct tag
{
member-list;
}variable-list;
例如描述一个学生:
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//分号不能丢
//结构体
声明一个结构体类型
struct Book
{
char name[20];
char author[20];
int price;
};
struct Book
{
char name[20];
char author[20];
int price;
}b1,b2;//全局变量 - 程序结束时即销毁
struct Book b3; //全局
int main()
{
struct Book b4;// 局部变量
return 0;
}
特殊的声明:
在声明结构的时候,可以不完全的声明。
比如:
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
上面的两个结构在声明的时候省略了结构体标签(tag).
//匿名结构体
struct
{
int a;
char c;
double d;
}s1,s2;
struct
{
int a;
char c;
double d;
}*ps;
int main()
{
ps = &s1; //error
return 0;
}
警告:编译器会把上面的两个声明当成完全不同的两个类型。所以是非法的。
1.2结构体的自引用
在结构中包含一个类型为该结构本身的成员是否可以呢?
//代码1
struct Node
{
int data;
struct Node next;
};
//可行否? - error
如果可以,那sizeof(struct Node)是多少?
正确的自引用方式:
//代码2
struct Node
{
int data; //数据域
struct Node* next; //指针域
};
注意:
//代码3
typedef struct
{
int data;
Node* next;
}Node;
//这样写代码,可行否? - error
//解决方案:
typedef struct Node
{
int data;
struct Node* next;
}Node;
1.3结构体变量的定义和初始化
有了结构体变量,那如何定义变量,其实很简单。
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {
x, y}
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {
"zhangsan", 20};//初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {
10, {
4,5}, NULL}; //结构体嵌套初始化
struct Node n2