事实上,目前有关结构体,只要牢记:
结构体类型: struct people (举例)
与普通的类型唯一与区别的就是结构体类型肚子里面还有结构体成员
结构体变量:struct people Elon 创建好后,Elon就是变量名了
结构体指针: struct people* p1 创建好后,p1就是指针变量了
结构(结构体简介)
1 在C语言当中有一些自定义类型: 结构体,枚举与联合体。今天正式来学一下结构体初阶。
2. 结构的基础知识: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。在之前我们就已经学过集合的概念:数组是一种相同类型元素的集合。
3. 那为什么在c语言当中会出现结构这个东西?结构也叫做结构体。为什么会出现结构体?是因为我们生活当中会出现许多复杂的对象,这种复杂的对象无法用单一的类型诸如int, float,char等等来描述,因此就出现了结构的概念,比如说我想要描述学生:我需要描述名字,年龄,性别与成绩.....这时候会发现,如果你想要描述一个复杂的对象,不可能就是用单个类型就可以描述的清楚,于是这时候就造出了结构,也叫做结构体.是一种自定义类型
创建结构体类型(其实也就是自定义一个类型)与结构体成员
1.创建结构体类型(结构的声明): 在struct后面随便可以加一个标签名(也不能说随便,应该说可以根据需求改变),然后在下面是一个大括号,里面就是用来描述这个结构,这个大括号里面是member-list,表示是成员列表,也说明这个大括号里面放的是结构体成员。(这个结构体的声明一般是在main函数外面的),然后具体到里面的结构体成员的声明,与之前在学的变量的声明也一样的。到现在已经讲了两个概念了:结构体类型与结构体成员。
此时我已经把一个新的类型(结构体类型)创造好了,这个新的类型是我自定义的,是原先c语言当中没有的。这个新的类型也不像c语言中的内置类型int, char那么简单。这个结构体类型当中有若干个结构体成员。以此形成一个聚合体。
注意:该类型名称为:struct people ,不是people,这个自定义结构体类型与int,char完全等价
创建与初始化结构体变量
1. 在上面只是创建结构体类型,当我把结构体类型创建好之后,我有了这个类型之后(注意:struct 标签名,这个整体合起来叫做类型的名称,你可以把它类比成int, chat, float等等),然后接下来我可以创建结构体变量了。
2. 创建与初始化结构体变量的时候,有两种语法形式。
这是一种:
还有一种:
3. 但还是有一些微小的差别,一个是全局,一个是局部的。当然了,单独的去创建结构体全局变量也是可以的。
4. 然后就是结构体变量的初始化,也就是说在创建结构体变量的时候于此同时赋给它一些值,去依次匹配结构体成员。结构体变量的初始化需要用一个大括号{}括起来。
访问结构体成员(1)
(特此再次强调:字符数组与字符串两者你目前就给它等价着去理解)
1. 当结构体类型,变量都创建好之后,并且对变量进行初始化也已经完成。那接下来就是对结构体的成员进行访问(比如说在打印的时候),这时候就可以用如下方法: 结构体变量.结构体成员。
2. 结构体成员也是结构体,嵌套了
当然还必须说明的是,结构体成员可以是一些整型,字符,浮点数啊等等,当然也可以还是一个结构体。在结构体里面也是可以出现结构体的。如果结构体成员也为结构体时,其实道理也是一样的,只要记牢: struct 标签名,这个就是结构体类型,等价于int, char等等,地位平等
访问结构体成员(2),用结构体指针
第二种访问结构体成员的方法就是:
结构体指针里面存放的是结构体变量的地址(对结构体变量取地址然后放到结构体指针里面),通过结构体指针可以用箭头很方便的访问结构体成员。同时对结构体指针进行解引用操作,就可以找到结构体变量。
1. 结构体指针->结构体成员 就可以访问结构体成员
2. *(结构体指针) 就可以找到结构体变量
操作总览
结构体传参
1. 接下来就是结构体传参,传参的时候可以传结构体变量。也可以传结构体变量的地址。那传结构体变量与传结构体变量地址这两种方式到底哪个好一点呢?如果只能选一个的话,实参为结构体变量的地址更好。
2. 其实相当于一个是传值调用,一个是传址调用,这时候就类比与数组传参。当我用传值调用的时候,我的实参是什么样的,当我的形参在接受我的实参的时候(形参实例化)也必须向内存申请与实参一模一样大的内存空间才能接受的下我的实参,但当我实参很大很大时,我把实参拷贝给形参,形参也需要存一份一模一样的数据,同时拷贝也需要时间过程,这样子就会占用很大空间与效率不高,传参压力很大。而如果我把地址给他传过去,一个地址的大小无非就是四个字节或八个字节。压力小太多了。
3. 结论:未来在结构体传参的时候,要传结构体变量的地址,也就是结构体指针