C学习第八天-结构体
作者:互联网
结构体
C语言结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由int、char、float等基本类型组成的。
在实际开发中,我们可以将一组类型不同的、但是用来描述同一件事物的变量放到结构体中。
在C语言中,可以使用结构体来存放一组不同类型的数据。
结构体的定义形式为:
struct 结构体名 {
结构体所包含的变量或数组
}
结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化。
注意大括号后的分号;不能少,这是一条完整的语句。
结构体也是一种数据类型,它由程序员自己定义,可以包含多个其他类型的数据。
像int、float、char等是由C语言本身提供的数据类型,不能再进行拆分,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它成为复杂数据类型或构造数据类型。
结构体变量
既然结构体是一种数据类型,那么就可以用它来定义变量。可以定义结构体后再定义结构体变量,也可以在定义结构体的同时定义结构体变量。
成员的获取和赋值
结构体和数组类似,也是一组数据的集合,整体使用没有太大的意义。数组使用下标[]获取单个元素,结构体使用点号.获取单个成员。
获取结构体成员的一般格式为:
结构体变量名.成员名;
整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。
结构体数组
结构体数组是指数组中的每个元素都是一个结构体。在实际应用中,C语言结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
结构体指针
结构体变量名或数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&。
获取结构体成员
通过结构体指针可以获取结构体成员,一般形式为:
(*pointer).memberName或者pointer->memberName
第一种写法中,.的优先级高于*,(*pointer)两边的括号不能少。第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员;这也是->在C语言中的唯一用途。
结构体指针作为函数参数
结构体变量名代表的是整个集合本身,作为函数参数时传递的整个集合,也就是所有成员,而不是像数组一样被编译器转换成一个指针。如果结构体成员较多,尤其是成员为数组时,传送的时间和空间开销会很大,影响程序的运行效率。所以最好的办法就是使用结构体指针,这时由实参传向形参的只是一个地址,非常迅速。
枚举类型
C语言提供了一种枚举类型,能够列出所有可能的取值,并给它们取一个名字。
枚举类型的定义形式为:
enum typeName{ valueName1, valueName2, valueName3, ... };
enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, ...是每个值对应的名字的列表。注意最后的;不能少。
枚举和宏其实非常类似:宏在预处理阶段将名字替换成相应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。
共用体
在C语言中,还有另外一种和结构体非常类似的语法,叫做共用体。
共用体定义格式:
union 共用体名
{
成员列表
};
共用体有时也被称为联合或者联合体。
结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
共用体也是一种自定义类型,可以通过它来创建变量。可以先定义共用体,再创建变量,也可以在定义共用体的同时创建变量。
标签:定义,变量,第八天,成员,数据类型,学习,数组,结构 来源: https://blog.csdn.net/weixin_43943624/article/details/122739282