c语⾔基础语法六——结构体(完结)
1;关于c语⾔结构体的引⼊;
在前⾯已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储⼀组具有相同类型的数据),字符串。但是在实际问题中只有这些数据类型是不够的,有时候我们需要其中的⼏种⼀起来修饰某个变量,例如⼀个学⽣的信息就需要学号(字符串),姓名(字符串),年龄(整形)等等,这些数据类型都不同但是他们⼜是表⽰⼀个整体,要存在联系,那么我们就需要⼀个新的数据类型。
——结构体,他就将不同类型的数据存放在⼀起,作为⼀个整体进⾏处理。
2;c语⾔使⽤结构体变量进⼀步加强了表⽰数据的能⼒。
2.1;结构体声明;
//申明⼀个结构体
struct book
{
char title[MAXTITL];//⼀个字符串表⽰的titile 题⽬;
char author[MAXAUTL];//⼀个字符串表⽰的author作者;
float value;//⼀个浮点型表⽰的value价格;
};//注意分号不能少,这也相当于⼀条语句;
这个声明描述了⼀个由两个字符数组和⼀个float变量组成的结构体,但是注意,他并没有创建⼀个实际的数据对象,⽽是描述了⼀个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。
下⾯介绍⼀下上⾯的结构体声明;
1,⾸先使⽤关键字struct,他表⽰接下来是⼀个结构体。
2;后⾯是⼀个可选的标志(book),它是⽤来引⽤该结构体的快速标记。因此我们以后就会可以这样创建数据对象struct book library;//把library设为⼀个可以使⽤book结构体的结构体变量,则library这个变量就包含了其book结构体中的所有元素
3;接下来就是⼀个花括号,括起了结构体成员列表,及就是每个成员变量,使⽤的都是其⾃⼰的声明⽅式来描述,⽤分号来结束描述;
列如;char title[MAXTITL];字符数组就是这样声明的,⽤分号结束;
注意;其中每个成员可以使⽤任何⼀种c数据结构甚⾄是其他的结构体,也是可以的;
4;在结束花括号后的分号表⽰结构体设计定义 的结束。
2.2,关于其struct声明的位置,也就是这段代码要放到哪⾥。同样这也是具有作⽤域的。
这种声明如果放在任何函数的外⾯,那么则可选标记可以在本⽂件中,该声明的后⾯的所有函数都可以使⽤。如果这种声明在某个函数的内部,则它的标记只能咋内部使⽤,并且在其声明之后;
2.3;关于我们不断说的,标记名是可选的,那么我们什么时候可以省略,什么时候⼀定不能省略呢?
如果是上⾯那种声明定义的⽅法,并且想在⼀个地⽅定义结构体设计,⽽在其他地⽅定义实际的结构体变量那么就必须使⽤标记; 可以省略,设计的同时就创建该结构体变量,但是这种设计是⼀次性的,
还有就是引⼊typedef。 这个到后⾯的定义结构体变量⼀起说吧?
关于结构体类型的定义的总结;
⼀般格式就是;
struct 结构体名(也就是可选标记名)
{
成员变量;
};//使⽤分号表⽰定义结束;
3;定义结构体变量;
3.1;之前我们结构体类型的定义(结构体的声明)只是告诉编译器该如何表⽰数据,但是它没有让计
算机为其分配空间。我们要使⽤结构体,那么就需要创建变量,也就是结构体变量;
创建⼀个结构体变量;struct book library;
看到这条指令,编译器才会创建⼀个结构体变量library,此时编译器才会按照book模板为该变量分配内存空间,并且这⾥存储空间都是以这个变量结合在⼀起的,这也是后⾯访问结构体变量成员的时候,我们就要⽤到结构体变量名来访问。
分析;
struct book的作⽤;在结构体声明中,struct book所起到的作⽤就像int,,,,等基础数据类型名作⽤⼀样。
struct book s1,s2,*ss;
定义两个struct book结构体类型的结构体变量,还定义了⼀个指向该结构体的指针,其ss指针可以指向s1,s2,或者任何其他的book结构体变量。
其实;
struct book library;
等效于;
struct book{
char …
….
…..
}librar;
这两种是等效的,只是第⼀种可以减少代码的编写量;
3.2;现在还是回到刚才提及的那个问题,可选标志符什么时候可以省略;
其⼆;其⼀;
struct
{
char title[MAXTITL];
char author[MAXAUTL];
float value;
}library;
//注意这⾥不再是定义声明结构体类型,⽽是直接创建结构体变量了,这个编译器会分配内存的;
//这样的确可以省略标识符也就是结构体名,但是只能使⽤⼀次;因为这是;声明结构体的过程和定义结构体变量的过程和在了⼀起;并且个成员变量没有初始化//如果你想多次使⽤⼀个结构体模块,这样⼦是⾏不通的;
⽤typedef定义新类型名来代替已有类型名,即给已有类型重新命名;
⼀般格式为;typedef已有类型新类型名;
typedef int Elem;
typedef struct{
int date;
.....
.....
}STUDENT;
STUDENT stu1,stu2;
总结⼀下关于结构体变量的定义;
1;先定义结构体类型后再定义结构体变量;
格式为;struct结构体名变量名列表;
struct book s1,s2,*ss;//注意这种之前要先定义结构体类型后再定义变量;
2;在定义结构体类型的同时定义结构体变量;
格式为;
struct结构体名
{
成员列表;
}变量名列表;//这⾥结构体名是可以省的,但尽量别省;
struct book
{
char title[MAXTITL];//⼀个字符串表⽰的titile 题⽬;
char author[MAXAUTL];//⼀个字符串表⽰的author作者;
结构体数组不能作为参数传递给函数float value;//⼀个浮点型表⽰的value价格;
}s1,s2;
3,直接定义结构体类型变量,就是第⼆种中省略结构体名的情况;
这种⽅式不能指明结构体类型名⽽是直接定义结构体变量,并且在值定义⼀次结构体变量时适⽤,⽆结构体名的结构体类型是⽆法重复使⽤的,也就是说,后⾯
4;对于结构体变量的初始化;
4.1;先回忆⼀下关于基本数据类型和数组类型的初始化;
int a = 0;
int array[4] = {1,2,3,4};//每个元素⽤逗号隔开
回忆⼀下数组初始化问题;
再回到结构体变量的初始化吧?
关于结构体变量的初始化与初始化数组类似;
也是使⽤花括号括起来,⽤逗号分隔的初始化好项⽬列表,注意每个初始化项⽬必须要和要初始化的结构体成员类型想匹配,
4.2;加⼊⼀点⼩知识;
关于结构体初始化和存储类时期的问题;
如果要初始化⼀个具有静态存储时期的结构体,初始化项⽬列表中的值必须是常量表达式,
如果存储时期是⾃动的,那么列表的值就不必是常量了;
关于这点在讲存储类时期的时候在分析;
4.3;注意如果在定义结构体变量的时候没有初始化,那么后⾯就不能全部⼀起初始化了; 意思就是;struct book s1={//对结构体初始化
"yuwen",//title 为字符串
"guojiajiaoyun",//author 为字符数组
22.5 //value 为flaot 型
};
//要对应起来,⽤逗号分隔开来,与数组初始化⼀样;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论