C语言——用户自定义数据类型

C语言

  • 知识基础
  • 控制语句
  • 函数
  • 输入输出
  • 指针和数组
  • 用户自定义数据类型
  • 文件操作

文章目录

  • C语言
  • 一、前言
  • 二、结构体类型
    • 1.结构体声明
    • 2.结构体变量
    • 3.链表
  • 三、共用体类型
  • 四、枚举类型
  • typedef 声明新类型名
  • 总结


一、前言

为什么需要自定义数据类型?
数据类型是所有可以被处理的数据的格式规定,我们已经介绍过基本类型和通过指针运算定义的指针类型和数组类型。在解决问题的过程中我们经常要处理一些实体的信息,这就需要对实体进行抽象,记录其各个方面的属性值,用已有的数据类型显然不能直接表示所有的属性,例如:一个班级的学生需要录入信息<学号,姓名> 这样一个简单的信息,没有一个基本类型能够直接描述,如果我们开辟两个数组分别存储学号和姓名,那么在处理过程中,这一对属性是完全割裂的,带来了极大的不便; 由此,引入结构体类型实现对多种数据类型的组合,该类型的的变量可以描述多个属性。

二、结构体类型

1.结构体声明

基本数据类型作为系统定义的数据类型,我们可以直接使用它们定义变量,系统自然知道数据类型的读写规则和存储空间大小;
结构体类型有多个种数据类型组合而成,所以我们需要表明结构体的结构

struct Student{
	int no;//学号
	char* name;//姓名
};

以上声明了一个新的数据类型struct Student,该数据类型有两个部分,我们称作它的两个成员,第一个成员是整型,第二个成员是字符指针类型。
由以上的声明,程序可以识别该类型,接下来我们可以定义struct Student类型变量

2.结构体变量

数据类型是不分配存储空间的,我们想要将信息存储处理的方式是定义变量然后对其赋值,定义结构体变量的方式有两种:
类似于基础数据类型的定义方式:

struct Student s1;//定义了一个学生

在声明的同时定义变量:

struct Student{
	int no;//学号
	char* name;//姓名
}s1;//定义了一个学生

struct{
	int no;//学号
	char* name;//姓名
}s1;

甚至我们在声明时并不命名新的数据类型名,只是定义一个变量也是合法的,但在之后的程序中我们只能使用这一个变量,不能定义新的变量是该结构体类型。
结构体类型本身并不会被分配空间,但是每定义一个变量,这些变量都会被分配具体的存储空间,结构体变量的大小 = 成员1大小 + 成员2大小 + ...
特别的,对于结构体中的指针类型,大小是一个地址所占的空间,定义变量时并不会为指针类型规定指向的空间,也就是说在调用结构体变量的指针成员时要动态分配空间,才能够读写。
读写结构体变量时,必须使用成员运算符.->调用成员变量,只有基础类型的成员变量,系统才能够直接读写;使用成员运算符能够找到正确的位置,得益于结构体声明。

3.链表

数组数据结构我们已经知道使用指针实现的开辟一段连续的存储空间,对结构体类型我们当然也可以定义数组,但数组的长度是固定的,也就是在定义数组时能够容纳多少个元素就是确定的,这在实际应用预留空间过小不够用,过大浪费太多的尴尬情况。。。
所以我们构思一种数据结构像一条链子,一节扣一节,我们可以动态的加减节数,从而动态的管理一组数据,我们称之为链表其中的每一节就是一个结构体变量:

struct Node{
	int val;
	struct Node* next;
};

这个结构体类型中包含两部分,一部份成员描述节点的值,一部分用于指向下一个节点。

三、共用体类型

意义:使用同一段内存空间存储不同类型的变量
声明与定义:与结构体方法一致,关键字不同,代表意义不同

union Data{
	int i;
	char c;
	float f;
}a;

union Data b;

存储空间:共用体大小 = max{成员1, 成员2,...}
引用:不能直接引用共用体变量!!!必须使用成员运算符指明某一个具体的成员。
说明:实际上的意义是可以用不同的读写方式对同一块存储空间进行操作,这在实现寄存器等经常变化并且有多种空间要求的机制时,比较高效!!!

四、枚举类型

意义:这种类型的变量所有可能的取值都被列出来,只能取其中之一
声明与定义:成员用逗号隔开,并不会指定数据类型,在C语言中默认指定

enum {
	mon,//=0
	sun,//=1
	tue,//=2
	wed,//=3
}day;//只能取值,枚举成员之一

day = mon;//等价于=0

存储空间:一般默认等价于int
引用:变量值只能是枚举中的一个
说明:实际上的意义是可以快速定义一些全局声明,一般不指定枚举名,不定义变量,直接引用成员就表示了一个区别于其他成员的状态

typedef 声明新类型名

在函数头部声明,转变数据类型名,更好的让函数中的数据类型见名知义;也能够让程序易移植、易维护。


总结

简单讲解了结构体、共用体、枚举类型;实际上与之前的基本类型的使用并没有本质上的区别,能够灵活使用的基础是掌握指针的使用!

你可能感兴趣的:(#,C语言,c语言)