构造数据类型

一、结构体类型

<一>、定义

构造一个新类型,把需要用到的数据类型组合在一起,并且占用空间内存。

<二>、结构体的声明与定义

struct 类型名{

int id;        //定义变量

char name[32];        //定义变量

……

}   ;//也可以在花括号后,分号前定义结构体变量

int main(){

struct student stu1={123,"刘备"};         //定义结构体变量stu1以及初始化

printf("%d %s",stu1.id,stu1.name);         //输出stu1保存的数据

     

注意:1、结构体变量可以相互赋值

struct student stu2=stu1;

结构体变量也是变量,这里是把stu1的值赋给stu2

            2、访问成员时

要单独赋给其中一个结构体变量的成员时,即访问结构体变量时,要细心:成员名不能单独访问,正确格式为:stu1.id=123;这是其一;第二是想好如何给值,如示范中的name是数组名,数组名是常量,应该使用string.h库中的拷贝函数:strcpy(stu1.name,"刘备"); 

            3、结构体可以套娃

//结构体的套娃
	//学生类型
struct student
{
	int s_id;//学号
	char s_name[32];//姓名
	float s_score;//成绩
};
//老师类型的声明
struct teacher
{
	int t_id;//老师编号
	char t_name[32];//老师姓名
	struct student stu;//老师所带的学生
};
//班级类型的声明
struct Class
{
	int c_id;//班号
	struct teacher t;//带班老师
};
struct Class C;//定义班级里的c变量。可以通过班级,找到班级里面的学生
C.t.stu.s_id = 125;
printf("%d\n", C.t.stu.s_id);
}

<三>、结构体数组

1,定义格式

数据类型 数组名[数组长度];

2,初始化

数据类型 数组名[数组长度]={初值1,初值2,初值3……};//里面的初值需要按顺序赋

都要记得分号,这是“一句话”。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

struct students {
	int id;
	char name[32];
	float score;

};
int main() {
	struct students stu[3] = {    //这里的结构体数组每一个变量都包含三个数据,可以采用花括号嵌套花括号的格式将其初始化。
		{123,"刘备",99.9f},
		{124,"关羽",87.9f},
		{125,"张飞",98.9f}
	};
	for (int i = 0; i < 3; i++) {    //利用循环输出各个数组值
		printf("%d %s %.2f\n", stu[i].id, stu[i].name, stu[i].score);
	}
}

 

<四>、typedef取别名 

1.格式

typedef 类型名 别名;

给整型取别名

typedef struct student STU;
	STU stu2 = {111,"左左",100.0f};
给“struct student”这个数据类型取别名,会便利一些

 2.结构体类型的另一种格式

typedef放在构造数据类型的地方

typedef struct student {
	int id;
	char name[32];
	float score;

}STU;//STU是别名,这里要与定义变量时区分开来

<五>、结构体大小(了解计算机是如何占用内存的,对于提高程序运行效率有帮助)

对齐机制:往最大的类型对齐(最大的类型不包括构造类型、数组)

struct student2//学生类型
{
	int id;//学号  占4字节
	double score;//成绩  占8
	char ch;//字符型占1
};
//对齐机制:往最大的类型对齐(最大的类型不包括构造类型、数组)
printf("%d\n", sizeof(struct student2));
计算机第一个数据占得是最大类型double的字节,可是第一个是int ,到第二个数据double时,剩下的不够用又重新占,浪费了四字节。第二个数据时占用了正好8字节,但char又要重新占8位,又浪费了7位,未免可惜

 总结:构造数据类型时,把大类型  放在前面 。从大到小往下放,很大程度上是节省内存空间的

调换顺序,内存变成16啦

二、共用体类型

与结构体唯一的不同——内存结构 

(了解即可,共同体的使用一般只出现在嵌入式里)

存储空间只用一次,对齐机制是最大的类型

占8个字节

三、枚举类型

1、枚举类型的声明格式

enum 枚举类型名{枚举列表};

//例如周列表
enum Week{sun,mon,tue=20,wed,thu,fri,sat};//枚举元素尽量用英文

2、枚举元素

是常量。没有在列表里赋初值是默认sun=0,后面的元素值,根据上一个枚举元素的值,+1

3、枚举类型

特殊的整型

4、作用

增强代码的可读性和可维护性

enum diretion{up='w',down='s',left='a',right='d'}dir;//上下左右
int main(){
while (1)//人物不断的移动
	{
		dir = (enum diretion)getchar();//左右两边要类型相同,这里对右边进行强制转化,转化成和枚举型一样特殊的整型
		switch (dir)
		{
		case up:
			printf("人物往上走了\n");
			break;
		case down:
			printf("人物往下走了\n");
			break;
		case left:
			printf("人物往左走了\n");
			break;
		case right:
			printf("人物往右走了\n");
			break;
		}
	}
}

增加代码可读性,如检测代码是否成功运行

enum RETURN{return_ok=0,return_bad=-1};
//检测  a是否异常   a==0异常(-1)  a!=0正常(0)
 RETURN check(int a)   //返回值类型记得写成定义的枚举类型,enum是用来声明与定义枚举类型的,不要添上去
{
	if (a == 0)
	{
		return return_bad;
	}
	else
	{
		return return_ok;
	}
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穿井侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值