结构体
结构体的声明
基础
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明
struct tag
{
member-list;
}variable-list;
例如描述一个学生:
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //分号不能丢
特殊的声明
在声明结构的时候,可以不完全的声明。
比如:
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20],*p;
上面的两个结构在声明的时候省略了结构体标签(tag)。
那么问题来了
//在上面代码的基础上,下面的代码合法吗?
p = &x
警告:
编译器会把上面的两个声明当成完全不同的两个类型。
所以是非法的。
结构的自引用
在结构中包含一个类型为该结构本身的成员是否可以呢?
//代码1
struct Node
{
int data;
struct Node next;
};
//可行否?
如果可以,那sizeof(struct Node)是多少?
正确的自引用方式:
//代码2
struct Node
{
int data;
struct Node* next;
};
注意:
//代码3
//代码3
typedef struct {
int data;
Node *next;
} Node;
//这样写代码,可行否?
//解决方案:
typedef struct Node
{
int data;
struct Node* next;
}Node;
结构体变量的定义和初始化
有了结构体类型,那如何定义变量,其实很简单。
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;