C的温故而知新:结构和其他数据形式(C Primer Plus第十四章)

第十四章:结构和其他数据形式

在我们使用语言进行程序编程设计的时候,经常会出现很多复杂的数据,,每到这种时候,就需要创建很多的变量去存储各种各类的数据。还有一种情况,不同类型的数据是相互关联的,这就需要将它们关联的放到关联的数据变量中。如果是企业JAVA开发的话,有可能是将其放到数据库之中,再或者使用JSON数据格式进行获取或者解析。但是在C语言中,有一些复杂的数据结构。本章主要是介绍这些数据存储形式。

结构:声明结构

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

此时,结构布局告诉编译器该结构如何去表示数据,但是还没有为数据分配空间。创建结构变量的时候才会分配数据空间

struct book library;

访问结构成员的话,使用点(.)访问结构中的成员。.比&的优先级高。

如果使用结构数组的话,要注意栈内存溢出问题。

struct book libraary[LENTH];

调用数组成员时:

library[2].value;//调用数组中第三个结构的value值
library[2].title[4];//调用数组中第三个结构的title字段中的第五个字符

此外,结构中还可以嵌套另一个结构,还存在指向结构的指针,像这样

struct book * it;
it = &threeBody;

和数组不同的是,结构变量名并不是结构变量的地址,因此要在结构变量名前面加上&运算符。使用指针访问成员的时候,有两种方法,可以使用->运算符,也可以使用*解引用运算符。需要注意的是,这里必须要用括号,因为.运算符的优先级比*高。

it->author;//相当于threeBody.author
(*it).author;//因为(*it)相当于*(&threeBody),也就是threeBody

接下来,就可以像使用数组或者变量一样,去使用结构进行函数之间的通信了,这里就不多赘述了。思考一下选择结构或者结构指针的时机。结构指针呢,执行起来比较快,而且只需要一个地址,缺点是无法保护数据,被调函数中的某些操作可能会意外的影响原来结构中的数据。除非加上const运算符。对于结构呢,老版本的实现可能无法处理这样的代码,传递结构比较浪费时间和存储空间。尤其是传递了一个较大的结构,但是它只使用了结构中的一两个成员。

在结构中,也可以使用malloc()函数和free()函数,创建一个合适的存储空间,将指针放到结构中,注意要在合适的位置对空间进行释放。

伸缩性数组成员:伸缩性数组成员必须是结构的最后一个成员;结构中必须至少有一个成员;伸缩数组的声明类似于普通数组,只是方括号中是空的。此外,不能用结构进行赋值和拷贝;不要以按值方式把这种结构传递给函数。要把结构的地址传给函数。不要使用带伸缩型数组成员的结构作为数组成员或另一个结构的成员。

此外,还有很多种结构的使用方式,匿名结构,在函数中使用结构数组,将结构内容保存到文件之中。这里就不一一的说了。大多是用到了先前学的内容。

联合:一种数据类型,可以在一个存储空间中存储不同的数据类型(不是同时存储),主要是为了存储混合类型的数据

union hold{
    int digit;
    double bigfl;
    char letter;
}

hold可以存储一个int类型的值或者一个double类型的值或者一个char类型的值。联合只能存储一个值。可以使用点运算符去表示使用哪种类型。

union hold fit;
fit.digit; = 23;

枚举:声明符号名称来表示整形常量。使用enum关键字。

enum spectrum {red, orange, yellow, green, blue, violet};
enum spectrum color;

第一个声明创建了spetrum作为标记名,第二个声明创建了color作为该类型的变量。枚举值的默认值是从零开始的常量,当然也可以为其赋值,如果只给一个枚举常量赋值的话,后面的枚举常量会被赋予后续的值。

typedef:typedef是一个高级数据特性,利用其可以为某一类型自定义名称,与#define类似,不同的是,typedef创建的符号名只受限于类型,不能用于值;由编译器解释,不是预处理器;在受限范围内,typedef比#define更灵活。typedef为经常出现的复杂类型创建一个方便、易识别的类型名。其并没有创建新类型,只是为已存在的类型创建一个方便的标签。

*表示一个指针,()表示一个函数,[]表示一个数组,()和[]的优先级相同,且比*高,从左到右结合,所以不同的组合下会创建很多不同的复杂类型,还有接下来的指向函数的指针。看看书上的例子,自行理解一下吧。我们后续会通过编程练习来看一下这块内容的具体运用。

在这里插入图片描述

在这里插入图片描述

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值