1.声明结构类型
我们都知道在程序里头,你要想表达一个数据,你就得有一个变量,而每个变量呢,又必须有一个类型,我们之前知道c语言有很多基础类型,int,char,float,double等等,还有指针.如果你想表达的数据比较复杂,它不是一个值,比如说你要表达一个日期,他有年月日三个值,你要表达时间,他有时分秒这三个值.但是你又希望是用一个整体去表达这么多集合在一起的数据,这时候我们就需要用到c语言的一种特殊的东西,叫做结构.一个结构就是一个复合的数据类型,在里面可以有很多各种类型的它的成员.然后我们用一个变量来表达那么多的数据.例如:
我们声明了一个结构体date,,在它后面有一对大括号,这对大括号里头是这个结构里面的成员,即每一个定义date类型里头都会有一个int类型的变量month,day和year,都会有三个这样的成员变量.那在声明这个结构的时候呢,这是一条c语言的语句,所以对初学者来说很容易忘掉的一件事情,在大括号之后要有一个分号,如果没有编译器会给一个error.
2.声明结构的形式
我们在做结构变化声明的时候,其实有很多稍微有变化的这种形式.上面这种是我们刚才看到的,我们去声明了一个结构,一旦声明了结构之后,我们就可以去使用这个结构,我们要在结构的名字前面加上struct来作为一个类型的名字.我们不能单纯拿point来作为类型的名字.
这是第二种声明形式:
我们并没有希望在很远的将来继续用这个结构类型,所以我们没有给它取名字,它说我只要p1和p2,当然这种做法不太常见.
我们更常用的是这种做法:
(这个t应该是多打出来的)
3.结构变量
我们要注意两件事情.struct date{};是在声明一种结构类型,而struct date today是在说明定义这种结构类型的一个变量.所以结构类型和结构变量是两回事情.我们声明了一种结构类型之后,可以用这种类型定义出很多结构变量来.每一个结构变量都按照它所声明的那种样子,里面会有year,会有month,会有day.
4.结构的初始化
因为我们知道,放在函数内部的变量我们叫做本地变量,它是没有默认的赋初始值的.如果你不去给它一个初始值,它这里头就是乱七八糟的值.所以我们怎么对一个结构变量赋初始值呢.和数组有些类似,我们还是用大括号来赋初值.
这是我们对结构体的集成初始化.我们看到我们有两种方式来做这个初始化.一种方式是说,today等于这个大括号,然后里面给了三个值,那你的编译器会知道说,你的这个07是给month,31是给day,而2014是给year.第二种方式是说,我可以具体指明里面的成员变量,然后通过点号给它赋值.这时候day会被默认赋0值,就像我们在给数组做集成初始化一样.我们来试一下这个程序.
运行结果:
5.结构成员
需要注意的是,出现在点号前面的一定得是具体的结构变量,而不是该结构变量的结构类型.结构变量才是实体.
6.结构运算
这个强制类型是将一个匿名的{5,10}(复合字面量)初始化为了一个结构体struct point.这个操作在一些编译器不需要的(比如我的dev c++),特别是你已经明确指定了p1是struct point类型的变量强制类型转换的.然而,出于代码的可维护性和可读性,尤其是在复杂的项目中,明确的强制类型转换可以减少潜在的类型冲突和编译器警告.如果你确认你的编译器不会因隐式转换发出警告,理论上可以省略强制转换.
最后这两种运算是数组不能做的.但是结构可以,我们来试一下这件事情:
结果是:
显然这两个输出的结果是一样的.我们再加上一个语句,day.year=2015,我们发现第二个输出的结果变成了2015-7-31.
7.结构指针