C语言_(10)_构造数据类型_结构体(1)

        在前面,我们都学过了C语言的基本数据类型,如整型类型、浮点型类型、字符型类型、缺省类型

        而C语言中我们可以构造数据类型。有结构体,共用体,枚举。

目录

 1 结构体的定义

 2 结构体变量的定义

 3 结构体元素的访问

 4 结构体初始化


 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;
}

猜你喜欢

转载自blog.csdn.net/m0_58193842/article/details/127673195