一起学《C程序设计》第十课——结构体、共用体以及枚举类型

注意,请认真学习完《C程序设计(第五版)》第九章后再阅读本文会有更大的收获。

 

结构体

作用与定义

前面我们学习过C语言的数组,C语言的数组在使用上有一定的局限性,比如我们常使用的一维数组一旦定义了就只能接纳一种数据类型,而生活中我们对某个事物的描述往往包含多个维度,比如一个人的基本信息包含:身高、体重、年龄,性别、爱好、籍贯……这些信息分别用整型、浮点、字符串等描述,是没有办法放在一个数组里供我们使用的,而这就引出了一个非常有用的C语言构造类型——结构体(structure)。

可以看出结构体是对数组的完美补充和扩展。定义一个结构体要使用struct关键字,花括号里对成员变量进行声明,如下示例:

代码里可以看见结构体可以嵌套定义,形成更复杂的构造类型。

初始化结构体变量

定义结构体的时候不能给成员赋初始值;结构体变量的初始化就是按照顺序写入初始值,从前往后匹配。初始值的间隔用逗号,而定义结构体时成员间隔用分号,这里不要搞混了。

如果初始值的个数少于成员的个数,那么就按照顺序匹配值给成员,没有匹配上的成员按照其数据类型来赋默认值(整型默认值为0,字符默认值为“\0”)。

引用结构体成员

常规引用方式为“点号运算符”来连接结构体变量和成员名称,如果有嵌套的结构体则按顺序使用点号引用成员(如上面示例xiao_ming.hometown.city)。

另一种引用方式通过指针来实现(下文中有介绍)。

结构体数组

相对于普通数组来说,结构体数组的类型和元素都是某个自定义的结构体。在使用上和普通数组没有太大的区别,可以通过循环或者下标来引用结构体数组里的元素。

结构体与指针

结构体变量的指针

结构体变量的指针,就好比一个整型数据的指针,定义的时候指定指针对应数据的类型,赋值就是结构体变量的首地址。

通过结构体指针变量来引用结构体里的成员时用“->”运算符。

结构体数组变量的指针

定义一个指向结构体数组变量的指针变量,和前面所学习定义一个普通数组的指针变量一样,指向数组的首个元素的地址,执行指针运算时,移动的单位地址长度是其对应结构体类型的长度,即指针移动一个单位长度会指向下一个结构体元素。

结构体变量作为函数的参数

结构体变量作为实参传递到函数中,实质上是把值复制传递给了形参,它们互不影响。

但是使用结构体变量的指针作为参数传递,如果结构体指针在函数内引用了结构体成员并发生值的变化,相应的函数外的结构体也会发生变化。

共用体

定义

共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。定义共用体和定义结构体类似,共用体声明关键字时union。

共用体占用的内存字节长度取决于最长的那个成员,并且只有最后一次赋值的成员才有效。

引用共用体成员

引用上也和结构体一致,可以用点号运算符,也可以使用指针的方式访问成员。

 

初学者可能对于共用体的使用场景不太好理解。如果接触过数据库的话,经常会遇到一个字段可能存储两个以上数据类型的值,这时候把数据读取出来,映射到程序中的时候就可以使用共用体来存储了。

共用体也可以和结构体嵌套使用,一般是结构体的某个成员类型定义为共用体。

枚举类型

所谓枚举,就是列出一个变量所有可能的值,定义一个枚举类型的关键字时enum。枚举类型使用上注意以下几点:

  • 成员定义形式一般为字符串,但是不要加引号

  • 成员的值实际上是整数,默认从0开始递增

  • 定义时可以任意指定成员的值,没有指定的保持“前面成员的值加一”这个规则

枚举类型相当于我们定义了一堆值为整数的同类型的常量,在使用上同样很直观方便。

小结

到目前,C语言的数据类型我们算是学完了,学以致用,一定要在实际运用中去熟练各种数据结构的用法,在不同的场景中使用不同的数据结构,必要时将它们嵌套使用以满足某些复杂的应用场景。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值