C语言入门第十章----结构体

  C语言结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由int、char 、float等基本类型组成的,你可以认为结构体是一种聚合类型。

  在实际开发中,我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。例如:在小学生有姓名、年龄、身高、成绩等属性,学了结构体后,我们就不需要再定义多个变量了,把他们都放到结构体中即可。

  =====什么是结构体===

    结构体是一种集合,它里面包含了多个变量或数组,他们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。

   结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。

  像int 、float 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型,而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称之为复杂数据类型或构造数据类型。

  理论上讲结构体的各个成员在内存中是连续存储的,和数组非常类似,但是在编译器的具体实现中,各个成员之间可能会存在缝隙。

===成员的获取和赋值

  结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下表[] 获取单个元素,结构体使用点号.获取单个成员。获取结构体成员的一般格式为

===需要注意的是:结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间,结构体变量才包含了实实在在的数据,需要内存空间来存储。

====结构体数组====

  所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体。

====结构体指针(指向结构体的指针)===

  当一个指针变量指向结构体时,我们就称它为结构体指针。C语言结构体指针的定义形式一般为: struct 结构体名 *变量名;

  注意,结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是挣个集合本身,要想取得结构体变量的地址,必须在前面加&。

====获取结构体成员===

  通过结构体指针可以获取结构体成员,一般形式为:(*pointer).memberName

或者 pointer -> memberName

  第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少。

 ===结构体指针作为函数参数===

  结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常快速。

====C语言枚举类型(enum 关键字)====

  在实际编程中,有些数据的取值往往是有限的,只能是非常少量的整数,并且最好为每个值都取一个名字,以方便在后续代码中使用。

  #define 命令虽然能解决定义的问题,但也带来了不小的副作用,导致宏名过多,代码松散,看起来总不舒服。C语言提供了一种枚举(Enum) 类型,能够列出所有可能的取值,并给他们取一个名字。

  枚举类型的定义形式为:

  需要注意的两点是:

  1)枚举列表中的Mon、Tues 这些标识符的作用范围是全局的,严格来说是main()函数内部,不能再定义与他们名字相同的变量。

  2) Mon、Tues 这些名字都被替换成了对应的数字,这意味着,Mon、Tues等都不是变量,它们不占用数据区的内存,而是直接被编译到命令里面,放到代码区,所以不能用&取得他们的地址。

====C语言共用体(union)关键字

  通过前面的讲解,我们知道结构体是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体(union),它的定义格式为:union 共用体名{ 成员列表 };

  结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响,而共用体的所有成员占用同一段内存,修改一个会员会影响其余所有会员。

  结构体占用的内存大于等于所有成员占用的内存的总和,成员之间可能会存在缝隙,共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。

  共用体也是一种自定义类型,可以通过它来创建变量。

====C语言位域(位段)====

  有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。基于这种考虑,C语言提供了一种叫做位域的数据结构。

  C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗的讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。

  我们可以这样认为,位域技术就是成员变量所占用的内存中选出一部分位宽来存储数据。

====C语言位运算详解====

  所谓位运算,就是对一个BIT位进行操作。在《数据在内存中的存储》一节中讲到,比特是一个电子元器件,8个比特构成一个字节,它已经是粒度最小的可操作单元了。

  C语言提供了六种位运算符:

  按位与,按位或,按位异或,取反,左移,右移

 ===& 是按照内存中的二进制位进行运算的,不是数据的二进制形式,其他位运算符也一样。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

posted on 2020-02-27 21:04  萧橘子  阅读(512)  评论(0编辑  收藏  举报

导航