在前面,我们都学过了C语言的基本数据类型,如整型类型、浮点型类型、字符型类型、缺省类型
而C语言中我们可以构造数据类型。有结构体,共用体,枚举。
目录
1结构体的定义
在起初学习C语言时,我们操作的对象基本上都是数,字符。那我们想构造一些类型的话,比如电脑、小猫、小狗、人、年龄、时间。则我们可以用关键字struct来构造出这个我们想要的类型。假如构造个小猫类型,他会有小猫A、小猫B、小猫C等等......我们就要用结构体这个东西了。
结构体类型的定义
struct 结构体名{
数据类型1 成员变量1;
数据类型2 成员变量2;
数据类型3 成员变量3;
数据类型4 成员变量4;
. . . . . .
};
定义一个新的类型,这个类型就叫struct student,而不是student
//定义了一个学生的类型(姓名,性别,年龄,学号)
struct student{
char name[32];
char sex;
int age;
int score;
};
当然结构体也可以嵌套定义
//定义一个日期的类型
struct date{
int year;
int month;
int day;
};
//定义一个时间的类型
struct time{
int hour;
int min;
int sec;
};
//定义一个既有时间又有日期的类型(结构体嵌套定义)
struct date_time{
struct date DATE;
struct time TIME;
};
还有种可能,就是自己定义的类型嵌套自己,那将会无限的嵌套下去,严重会崩溃。
struct node{
struct node n;
};
因为我们不知道给这个未知的类型没有一个固定的空间,但我们给他取成指针,就不会有以上的状况了,因为指针他会有8字节固定的大小。
struct node{
struct node *n;
};
2 结构体变量的定义
存储类型 数据类型 变量名;
定义可以定义为局部变量和全局变量,都可以。指针也可以
struct student Tom;//定义一个学生Tom struct student Jack;//定义杰克 struct student *p_Jack;//定义杰克
杰克和汤姆是独立的,但是他们两个都是学生。
而有的时候我们可以直接定义在结构体后面,可以有指针,也可以有变量。
//定义了一个学生的类型(姓名,性别,年龄,学号) struct student{ char name[32]; char sex; int age; int score; }Tom,Jack,p_Jack;
3 结构体元素的访问
变量 . 访问结构体的成员
指针-> 访问结构体的成员
struct student Tom;//定义一个学生Tom struct student Jack;//定义杰克 strcpy(Jack.name,"Jack");//数组的数组名不是一个变量,所以要用字符串赋值函数strcpy Jack.sex = 'M'; Jack.age = 18;
这就是访问杰克的姓名,性别和年龄
则结构体访问成员变量表达式的类型由成员变量类型决定。
4 结构体初始化
全部初始化
struct student Jack = {"Jack",'m',19,60}; struct date_time dt = { {2022,11,3},{18,18,18}};
局部初始化
struct student Tom = {
.name = "Tom",
.score = 100
} ;
剩余没有给定元素都是0值
嵌套结构体局部初始化
struct date_time = {
.DATE = {
.year = 2022,
},
.TIME = {
.hour = 18,
.min = 18,
}
};
根据以上所综合,来一个代码范例实操
#include <stdio.h>
#include <string.h>
//定义一个日期的类型
struct date{
int year;
int month;
int day;
};
//定义一个时间的类型
struct time{
int hour;
int min;
int sec;
};
//定义一个既有时间又有日期的类型(结构体嵌套定义)
struct date_time{
struct date DATE;
struct time TIME;
};
//定义了一个学生的类型(姓名,性别,年龄,学号)
struct student{
char name[32];
char sex;
int age;
int score;
};
int main(int argc, const char *argv[])
{
struct student Tom;//定义一个学生Tom
struct student Jack = {"Jack",'m',19,60};
struct date_time dt = {
{0,0,0},{0,0,0}};
strcpy(Tom.name,"Tom");
Tom.sex = 'M';
Tom.age = 18;
Tom.score = 100;
printf("Tom的姓名%s\n",Tom.name);
printf("Tom的性别%c\n",Tom.sex);
printf("Tom的年龄%d\n",Tom.age);
printf("Tom的成绩%d\n",Tom.score);
printf("========================================\n");
printf("Jack的姓名%s\n",Jack.name);
printf("Jack的性别%c\n",Jack.sex);
printf("Jack的年龄%d\n",Jack.age);
printf("Jack的成绩%d\n",Jack.score);
printf("========================================\n");
dt.DATE.year = 2022;
dt.DATE.month = 11;
dt.DATE.day = 3;
dt.TIME.hour = 18;
dt.TIME.min = 18;
dt.TIME.sec = 18;
printf("现在是%d年%d月%d日%d时%d分%d秒\n",
dt.DATE.year,
dt.DATE.month,
dt.DATE.day,
dt.TIME.hour,
dt.TIME.min,
dt.TIME.sec);
return 0;
}