1、结构体
结构体是一种自定义类型。
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
2、结构体的声明
c
struct Student
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};//分号不能丢
以上声明的结构体的数据类型是:struct Student
,这是一个整体,不能分开。
3、结构体变量的创建和初始化
c
#include <stdio.h>
#include <string.h>
struct Stu
{
char name[20];//名字
int age;//年龄
char sex;//性别
char id[20];//学号
}s0 = {"zero", 0, 'M', "0"},s2;
//结构体全局变量的定义方式1
//结构体全局变量的初始化方式1:按照结构体成员变量的默认顺序初始化
//结构体全局变量的定义方式2
//结构体全局变量的初始化方式1:按照结构体成员变量的默认顺序初始化
struct Stu s1 = {"one", 1, 'M', "1"};
int main()
{
printf("name: %s\n", s0.name);
printf("age : %d\n", s0.age);
printf("sex : %c\n", s0.sex);
printf("id : %s\n", s0.id);
printf("name: %s\n", s1.name);
printf("age : %d\n", s1.age);
printf("sex : %c\n", s1.sex);
printf("id : %s\n", s1.id);
//结构体全局变量的初始化方式2:按照结构体成员变量的指定顺序初始化
strcpy(s2.name, "two");
s2.age = 2;
s2.sex = 'F';
strcpy(s2.id, "2");
printf("name: %s\n", s2.name);
printf("age : %d\n", s2.age);
printf("sex : %c\n", s2.sex);
printf("id : %s\n", s2.id);
//-------------------------------------------------------
//结构体局部变量的定义方式
//结构体局部变量的初始化方式1:按照结构体成员变量的默认顺序初始化
struct Stu s3 = {"three", 3, 'M', "3"};
printf("name: %s\n", s3.name);
printf("age : %d\n", s3.age);
printf("sex : %c\n", s3.sex);
printf("id : %s\n", s3.id);
//结构体局部变量的初始化方式2:按照结构体成员变量的指定顺序初始化
struct Stu s4 = {.age = 4, .name = "four", .id = "4", .sex = 'F'};
printf("name: %s\n", s4.name);
printf("age : %d\n", s4.age);
printf("sex : %c\n", s4.sex);
printf("id : %s\n", s4.id);
//结构体局部变量的初始化方式2:按照结构体成员变量的指定顺序初始化
struct Stu s5;
strcpy(s5.name, "five");
s5.age = 5;
s5.sex = 'F';
strcpy(s5.id, "5");
printf("name: %s\n", s5.name);
printf("age : %d\n", s5.age);
printf("sex : %c\n", s5.sex);
printf("id : %s\n", s5.id);
return 0;
}
4、结构体类型的重命名
c
typedef struct Student
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//将结构体数据类型struct Student重命名为Stu
5、匿名结构体
c
struct
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}s1;
1、匿名结构体类型就是在声明时,省略了标签的结构体数据类型。
2、匿名的结构体类型,如果没有对结构体类型使用typedef
进行重命名的话,就只能在声明时定义结构体变量。
3、匿名结构体类型不能进行自引用。
6、结构体类型指针
c
#include <stdio.h>
typedef struct Node
{
int data;
}Node, *pNode;
int main()
{
struct Node *p1 = NULL;//结构体指针定义方法1
Node *p2 = NULL;//结构体指针定义方法2
pNode p3 = NULL;//结构体指针定义方法3
return 0;
}
以上为三种结构体指针局部变量的方法。
7、结构体的自引用
结构体的自引用涉及到数据结构。
匿名的结构体类型是不能进行自引用的。
错误的自引用:
c
struct Node
{
int data;
struct Node next;
};
以上代码是错误的,因为一个结构体中再包含一个同类型的结构体变量,这样结构体变量的大小就会无穷的大,无法用sizeof()
操作符获得其大小,是不合理的。
正确的自引用:
c
struct Node
{
int data;
struct Node *next;
};
结构体的自引用时,结构体内部不能使用typedef
产生的新命名,即:
错误代码:
c
typedef struct Node
{
int data;
Node *next;
}Node;
正确代码:
c
typedef struct Node
{
int data;
struct Node *next;
}Node;
原因 :因为typedef
的重命名作用是从新命名Node
出现才开始生效的,可是在新命名Node
出现前,也就是在结构体内部需要提前使用结构体类型,此时的typedef
产生的新命名还未生效,所以在结构体内部不能使用typedef
产生的新命名。
结构体的自引用常用于数据结构中对链表节点
的构建。
c
struct Node
{
int data;//数据域
struct Node *next;//指针域
};
链表节点
内部划分为数据域
与指针域
,数据域
存放本节点所包含的信息,指针域
存放指向下个节点的指针。