欢迎光临
我们一直在努力

第10章 自定义数据类型

10.1 枚举

c语言中的一种用户自定义数据类型,用于定义一组相关的常量

枚举类型的存储大小恒为4,与其中包含多少个枚举元素无关

10.1.1 语法格式

enum 枚举名称
{
枚举元素1,
枚举元素2,
...
枚举元素N
};

10.1.2 枚举常量(枚举元素)

1、枚举元素的值必须在同一枚举中是唯一的
2、枚举元素的值必须是整数类型,通常是int
3、如果没有为枚举元素指定值,编译器会自动为它们分配值,从0开始,依次递增。
4、定义枚举的时候也可以为枚举元素自定义值,需保证唯一性和整型类型。

enum Weekday
{
MONDAY,//0
TUESDAY,//1
WEDNESDAY,//2
THURSDAY,//3
FRIDAY,//4
SATURDAY,//5
SUNDAY//6
};

10.1.3 枚举变量

定义变量时指定的变量的类型是枚举类型,称变量为枚举变量,枚举变量的值必须是枚举类型里其中一个枚举常量

1、语法

(1)第一种:先定义枚举类型,再定义枚举变量

//定义枚举类型
enum DAY
{
MON = 1,
TUE,
WED,
THU,
FRI,
SAT,
SUM
};
//使用定义的枚举类型定义枚举变量
enum DAY day;

(2)第二种:定义枚举类型的同时定义枚举变量

enum Weekday
{
MONDAY,
TUFSDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}day1 , day2 = SUNDAY;

(3)第三种:定义枚举类型的同时定义枚举变量,且省略类型名

enum
{
MONDAY,
TUFSDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}day1 , day2 = SUNDAY;

10.2 结构体

结构体类型的存储大小
需要进行内存对齐:
1、成员对齐:成员的偏移量以 自身大小的整数倍 与 系统对齐长度 其中较小的为准
2、结构体整体对齐:结构体的大小必须是 基准对齐长度 的整数倍
3、系统对齐长度:通过#pragma pack()设置系统对齐长度
4、及准对齐长度:从系统对齐长度 与 结构体中最大成员的长度中取最小的

struct S1 //16
{
char c;
int i;
double d;
};

在这里插入图片描述

struct S2 //24 此时系统对齐长度为8
{
char c;
int i;
double d;
char c1;
};

在这里插入图片描述

通过#pragma pack()改变系统对齐长度后变为20

#pragma pack(4) // 设置系统对齐长度为4
struct S2 //20
{
char c;
int i;
double d;
char c1;
};

在这里插入图片描述

10.2.1 语法格式

struct 结构体名
{
数据类型1 成员名1;
数据类型2 成员名2;
...
数据类型n 成员名n;
};

10.2.2 声明结构体变量

1、方式一:先定义结构体,然后再创建结构体变量

// 定义结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 定义结构体变量
struct Student stu1,stu2;

2、方式二:在定义结构体的同时定义结构体变量

// 定义结构体的同时定义 stu1和 stu2 两个变量
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;

3、方式三:在定义时不给出结构体名

// 不给出结构体的名字
struct
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
} stu1, stu2;

10.2.3 成员的获取和赋值

成员(属性)是结构体的一个组成部分,一般是基本数据类型,也可以是数组、指针、枚举、结构体等

结构体使用 ‘.’ 获取单个成员,可以进行赋值和取值

// 声明结构体
struct Student
{
int id; // 学号
int age; // 年龄
char *name; // 姓名
char gender; // 性别
char *address; // 家庭住址
};
// 声明结构体变量
struct Student stu;
// 逐个对成员进行赋值
stu.id = 1001;
stu.age = 19;
stu.name = "Jack Ma";
stu.gender = 'm';
stu.address = "Changping BeiJing";

10.2.4 结构体指针

结构体指针是指向结构体的指针变量,允许间接访问和操作结构体的成员,它提供了一种方便的方式来处理结构体数据

语法格式:声明结构体指针struct 结构体名 *结构体指针变量,结构体指针可以通过“->” 操作符访问结构体的成员。

// 声明结构体
struct Student
{
char *name;
int age;
char gender;
};
// 结构体变量
struct Student s = {"张三", 20, 'M'};
// 通过结构体变量访问成员
printf("name=%s,age=%d,gender=%c \\n", s.name, s.age, s.gender);
// 声明结构体指针
struct Student *ps = &s;
// 结构体指针通过解引用访问成员
printf("name=%s,age=%d,gender=%c\\n", (*ps).name, (*ps).age, (*ps).gender);
// 结构体指针使用->访问成员
printf("name=%s,age=%d,gender=%c\\n", ps->name, ps->age, ps->gender);

如果指针变量p指向一个结构体变量stu,则:
stu.成员名 == (*p).成员名 == p->成员名

10.3 共用体

共用体类型的存储大小等于最长的成员的长度;几个成员共用一个内存区
内部可以包含各种属性,但同一时间只能有一个属性,因为所有属性都保存在同一个内存地址,后面写入的属性会覆盖前面的属性

10.3.1 语法格式

union 共用体类型名称
{
数据类型 成员名1;
数据类型 成员名2;

数据类型 成员名n;
};

10.3.2 声明共用体变量

1、方式一:先定义共用体类型,再定义共用体变量

// 声明共用体类型
union data
{
short m;
float x;
char c;
};
// 声明共用体变量
union data a, b;

2、方式二:定义共用体类型的同时定义共用体变量

union data
{
short m;
float x;
char c;
} a, b;

3、方式三:在定义时也可以不给出共用体名

union
{
short m;
float x;
char c;
} a, b;

10.3.3 成员的获取和赋值

同结构体一样,共用体也使用点号.获取单个成员,可以进行赋值和取值。

1、方式1:

union data a;
a.c = 4;

2、方式2:声明共用体变量的同时,给任一成员赋值

union data a = {.c = 4};

3、方式3:声明共用体变量的同时,给首成员赋值

union data a = {8};

注意:方式3不指定成员名,所以只能为第一个成员进行赋值。

10.4 typedef

C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样

1、为某个基本类型起别名

typedef 类型名 别名可以一次性起多个别名

typedef unsigned char Byte; //为类型 unsign char 起别名 Byte
Byte c = 'z';

2、为结构体、共用体起别名

(1)先定义结构体,再起别名

struct Treenode
{
// …
};
typedef struct Treenode Tree;

(2)定义结构体的同时起别名

typedef struct Treenode
{
char *name;
int legs;
int speed;
} Tree;

3、为指针起别名

typedef char *String;//为字符指针起别名为 String
char *str1 = "hello"; // 之前的写法
String str2 = "hello"; // 现在的写法

4、为数组起别名

//给 int[100] 取别名 Num
typedef int Num[100]; // 声明Num为整型数组类型名
Num a; // 相当于 int a[100];

赞(0)
未经允许不得转载:171主机测评 » 第10章 自定义数据类型
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址