结构和其拓展类型(联合、枚举)

本文介绍了C语言中的结构体(struct)、联合体(union)和枚举类型(enum)。结构体用于组合多种数据类型,可以通过typedef创建别名。联合体在同一内存位置存储不同类型的数据,而枚举提供了一种定义整数常量的清晰方式。文章详细讲解了如何声明、定义、初始化结构体和访问其成员,以及如何使用结构体数组和指向结构体的指针。此外,还涵盖了联合体的用法和枚举类型的声明及应用。
摘要由CSDN通过智能技术生成

结构和其拓展类型

  • 本章包含的关键字——structunion(联合)、typedefenum(枚举);
  • 用来操作结构的运算符——._>
  • 介绍如何创建结构模板和结构变量;
  • 联合和指向函数或结构的指针;

1.如何构建一个结构声明且定义结构变量

结构声明描述了一个结构的组织布局。声明类似下面这样:

struct book{
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};

分析这个程序,首先是关键字struct,它表明跟在后面的是一个结构,后面是一个可选标记(该例中是book),稍后的程序中可以引用该结构,可以这样声明:

struct book library;//这条语句把library声明为一个book结构布局的结构变量;结构的标记名是可选的;

这个结构里共又三个部分,每个部分都称为成员或字段;该声明只描述了该对象由什么组成。【有时候结构声明称为模板,因为它勾勒的是结构如何存储数据的。C++的模板更加强大,但这里不介绍,后续会在此放置链接】;

定义结构变量:结构有两层含义。一层是结构布局,刚刚已经讨论过了。布局告诉编译器如何表示数据,但是它没有让编译器为数据分配内存空间。下一步是创建结构变量,此时会分配内存;

在使用中,struct book就像int一样,可以定义为变量,也可以定义为指向struct book类型结构的指针;

结构数组:通常需要表示同结构的多类型成员,就需要用到结构数组;

struct book{
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};
//先声明结构,再创建结构数组;
struct book library[MAXBKS];

2.如何初始化和访问结构成员

struct book library = {
    "The Pious Pirate and the Devious Damsel",
    "Renee Vivotte",
    1.95
};

如上,可以像初始化数组一样初始化结构,每个元素之间用隔开,初始化顺序不能变;

C99和C11为结构提供了指定初始化器——.,可以这样初始化:

struct book gift = {.value = 25.99,
                   	.author = "James Vroadfool",
                   	.title = "Rue for the Toad"};

依旧用逗号间隔,但使用指定初始化器后,可以不按顺序初始;

访问结构成员时可以这样访问:gift.value,关键在点;

3.指向结构的指针

首先,需要声明一个结构指针struct guy * him;,和其他指针声明一样;

//运用结构指针
him = &barney;///barney是一个sreuct guy类型的结构;

其次就是通过指针访问结构成员

第一种方法是使用_>运算符。

如果有hin == &barnry;
使用him _>icmome;///icmome是结构barnry的一个成员;

第二种方法是使用解引运算符*

felloe[0] = (*him).inmome  ==  him_>inmome;

一个结构可以直接赋值给另一个结构,但数组不能这样做,结构还可以作为返回值传递

补充:伸缩性数组成员,要求:必须是结构的最后一个成员;结构中必须至少有一个成员;伸缩数组的声明类似于普通数组,只是它的方括号是宽的;

struct fles
{
	int count;
	double average;
	double cor[];
};

联合类型

联合是一种数据类型,与结构类似但共享一块内存空间,能在同一块内存空间中存储不同的数据类型(不是同时存储),同一时间只能存储一个值;

union hold{
    int digh;
    double big;
    char str;
};

以上代码表示联合类型hold中可以存储一个值,这个值可以是int,double,char中的任意类型,但只能存储其中一个类型的一个值;

union hold fit;
fit.digh = 22;//给digh赋值为22
fit.big = 11.3;//清除22,存储11.3
fit.str = 's';//清除11.3,存储s

pu = &fit;

x = pu_>digit;;//相当于x = fit.digit;

枚举类型

enum spct{one,two,there};

枚举类型声明符号表示整型常量。使用enum关键字;此处常量为int类型。

如上面的代码,声明枚举类型,此时one表示整数0,two表示整数1,以此类推,there表示整数2;可以把one,two理解为一个常量名;

枚举类型的目的是提高程序的可读性和可维护性;

注意:枚举只能在内部使用;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值