C语言自定义类型详解
C语言中自定义类型是构建代码结构的关键组成部分。一个程序中定义的自定义类型,可以用来描述程序中的状态和数据,使程序更加清晰和易于维护。C语言中的自定义类型有结构体、枚举、联合体和位段等。
本文将为大家详细讲解C语言中这四种自定义类型的使用和应用场景。
结构体
定义结构体
结构体是用于存储多个不同数据类型的变量的自定义类型。例如,一个保存学生信息的结构体可以包含学生的姓名、学号和成绩等信息。
定义结构体的语法如下:
struct [结构名]
{
[成员列表];
};
其中[结构名]是可选的,如果省略,则可以在后续定义变量时指定结构体成员,并直接使用。[成员列表]是由一个或多个成员组成的列表,每个成员由类型和名称组成,中间用空格隔开。例如:
struct student
{
char name[20];
int id;
float score;
};
上述结构体定义了一个名为“student”的结构体,包含三个成员:一个20字节的字符数组“name”表示学生姓名,一个整型“id”表示学号,一个单精度浮点数“score”表示成绩。
访问结构体成员
定义结构体后,就可以通过结构体变量来访问其成员,语法如下:
[结构名].[成员名]
例如,要访问名为“student”的结构体变量“stu”的成员“id”,可以这样写:
struct student stu;
stu.id = 10001;
结构体变量的初始化
结构体变量的初始化方式有两种:第一种是在定义结构体变量时进行初始化,例如:
struct student stu = {"Tom", 10001, 89.5};
第二种是在定义结构体时指定初始值,例如:
struct student stu = {.name = "Tom", .id = 10001, .score = 89.5};
枚举
枚举是一种用于定义由常量值组成的类型的自定义类型。例如,一个描述星期的枚举类型可以包含星期一到星期日七个常量。定义枚举的语法如下:
enum [枚举名]
{
[枚举列表];
};
其中[枚举名]是可选的,如果省略,则可以在后续定义变量时指定枚举成员,并直接使用。[枚举列表]是由一个或多个枚举成员组成的列表,每个成员由名称和常量值组成,中间用等号隔开。例如:
enum week
{
Mon = 1,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};
上述枚举定义了一个名为“week”的枚举类型,包含七个成员,分别是星期一到星期日,常量值从1到7。其中枚举成员“Tue”从“Mon”的常量值(1)开始加1,依次类推。如果不指定枚举成员的常量值,则从0开始,依次加1。
访问枚举成员
访问枚举成员的方式和访问结构体成员类似,语法如下:
枚举变量 = [枚举名].[枚举成员]
例如,要将星期五赋值给枚举变量“day”,可以这样写:
enum week day;
day = Fri;
联合体
联合体是一种特殊的结构体,它的所有成员占用同一块内存空间。联合体中只有一个成员可以被同时使用,而其他成员则需要先被显式地初始化或赋值,才能使用。定义联合体的语法如下:
union [联合体名]
{
[成员列表];
};
其中[联合体名]是可选的,如果省略,则可以在后续定义变量时指定联合体成员,并直接使用。[成员列表]是由一个或多个成员组成的列表,每个成员由类型和名称组成,中间用空格隔开。例如:
union data
{
int num;
float f;
char str[20];
};
上述联合体定义了一个名为“data”的联合体,包含三个成员:一个整型“num”表示整数,一个单精度浮点数“f”表示浮点数,一个20字节的字符数组“str”表示字符串。
访问联合体成员
由于联合体中所有成员占用同一块内存空间,因此只能访问最后一次赋值或初始化的成员。访问联合体成员的方式和访问结构体成员类似,语法如下:
[联合体名].[成员名]
例如,要将整型变量“n”赋值给联合体变量“d”的成员“num”,可以这样写:
union data d;
int n = 100;
d.num = n;
位段
位段是一种用于定义一组由几个二进制位组成的数据存储结构的自定义类型。位段可以减小内存占用量,提高空间利用率。定义位段的语法如下:
struct [结构名]
{
[成员列表]
[位段列表]
};
其中[成员列表]和[结构名]与结构体的定义相同,[位段列表]则是一个或多个位段成员,由类型、名称和位段长度组成,中间用冒号隔开。例如:
struct flags
{
unsigned int bit1 : 1;
unsigned int bit2 : 2;
unsigned int bit3 : 3;
};
上述位段定义了一个名为“flags”的结构体,包含三个成员,分别是长度为1的无符号整型“bit1”、长度为2的无符号整型“bit2”和长度为3的无符号整型“bit3”。
访问位段成员
访问位段成员的语法和访问结构体成员类似,例如:
struct flags f;
f.bit1 = 1;
f.bit2 = 2;
f.bit3 = 5;
上述代码将位段成员“bit1”赋值为1,将位段成员“bit2”赋值为2,将位段成员“bit3”赋值为5。
示例说明
示例1
以下是一个使用结构体的例子,定义了一个存储矩形信息的结构体,并计算了矩形的面积。
#include <stdio.h>
struct rectangle
{
float width;
float height;
};
int main()
{
struct rectangle rect;
rect.width = 3.0;
rect.height = 4.0;
float area = rect.width * rect.height;
printf("The area of the rectangle is %f\n", area);
return 0;
}
输出结果为:
The area of the rectangle is 12.000000
示例2
以下是一个使用枚举的例子,定义了一个星期的枚举类型,并输出星期一的常量值。
#include <stdio.h>
enum week
{
Mon = 1,
Tue,
Wed,
Thu,
Fri,
Sat,
Sun
};
int main()
{
printf("The constant value of Monday is %d\n", Mon);
return 0;
}
输出结果为:
The constant value of Monday is 1
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言自定义类型详解(结构体、枚举、联合体和位段) - Python技术站