结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
目录
结构体类型的声明
结构体声明基本格式
struct tag //定义结构体名
{
member-list; //定义结构体成员
}var-list; //定义变量名
注意:不管定不定义变量名,结构体末尾的分号都不可省略!
例如描述一个学生的基本信息:
struct stu1 //stu 为自定义的结构体名称
{
char name[10];
int age;
int score[3];
}p1,*pf; //在声明结构体时定义了结构体p1,结构体指针pf
struct stu2
{
char name[10];
int age;
int score[3];
}; //也可以选择不进行变量声明
上述例子中定义了一个名为stu的结构体,stu中包含name、age以及score三种信息。
- 第一个写法是在声明结构体时,创建了一个结构体stu的变量p1和结构体stu的指针pf。
- 第二个写法则是只声明结构体,不创建变量。
- 二者的区别在于变量的生命周期不一致,前者创建的变量与stu1的生命周期一致,如果stu1包含在头文件中,那么变量的生命周期也会贯穿程序的始末;后者的生命周期则根据其所处的位置而定。
关于结构体的使用及初始化后文会进行讲解。
用typedef对结构体进行声明
typedef可以对类型进行重定义,方便日后的代码简化及修改工作,例如:
typedef int Datatype;//将int重定义为Datatype
Datatype x;
结构体的typedef的用法也是如此,不过需要注意一些细节,看下面这个例子:
typedef struct student
{
char name[10];
int age;
int score[3];
}stu,*pf;
这里的等价关系为:
- struct student x; = stu x;
- struct student* px; = pf px;(x为自定义的变量名)
结构体不完全声明
在声明结构体时,可以进行不完全的声明,即:在声明时省略结构体名称(tag),而以这种方式声明的结构体由于没有标签,只能使用一次。
//匿名结构体类型
struct
{
int a;
char b;
double c;
}tmp;
结构的自引用
结构体可以包含结构体自身的指针:
struct Node
{
int data;
struct Node* next;
};
在后续学习数据结构中的链表时,就会使用上以上这种写法。
需要注意的是,如果使用typedef对结构体进行重定义,以下这种写法是错误的:
typedef struct Node
{
int data;
Node* next;//这种写法是错误的!
pNode next;//错误的!
*pNode next;//也是错误的!
}Node,*pNode;
在C语言中程序是从上往下,从左往右读的,声明tpyedef的变量名在声明结构体成员之后,以上写法自然就是错误的了,当然在C++中会有类似的写法,那就是后续需要学习的了。
结构体变量定义及初始化
在前文讲解了结构体如何声明,接下来介绍结构体如何进行变量的定义及初始化。
结构体定义变量有两种方法:
1.声明结构体时定义变量:
struct test
{
int x;
int y;
}p1,p2; //声明类型的同时定义变量p1,p2
2.利用结构体类型定义变量:
struct test
{
int x;
int y;
}
struct test p1;
结构体初始化:
结构体变量的初始化与数组有些类似,即在定义变量时可以对全部结构体成员进行初始化赋值,而定义变量后只能通过下标访问指定成员进行赋值。
初始化:
struct test
{
int x;
int y;
}p1={0}, p2={1,2};
struct test p3 = { 1,2 };//定义变量时直接初始化
访问下标:
struct test
{
int x;
int y;
}p1;
struct test* p2;//创建结构体指针p2
p1.x = 1;
p2->x = 1;
其中“ . ”就是访问结构体成员的操作,而当对象为结构体指针时,则采用“ -> ”对结构体进行访问。