1.结构声明:描述了一个结构的布局,关键字“struct”。
如:
该声明描述了一个由两个字符数组和一个float类型变量组成的结构。
关键字“struct”,后面是一个可选的标记(该例中“book”)。
2.定义结构变量
2.1 结构有两层含义:1.“结构布局”(即:结构声明),2.“结构变量”。
如:struct boook library;
创建了一个结构体变量library,而“struct book”相当于一般声明中的 int 或 float(基本数据类型).
2.2 定义结构体变量有三种方式:
3.初始化结构
4.结构数组
前面说过结构体在定义之后其类型相当于一般数据类型,如:"struct book".
一般的数组定义方式:int arr[N];
同样结构数组的定义方式:
5.结构嵌套
输出结果:
6. 指向结构体的指针
结构体类型相当于基本数据类型同样也可以声明只想结构体的指针
运行结果:
7. 向函数传递信息
7.1传递结构成员 (以值的方式传递)
7.2传递结构 (以值的方式传递)
7.3传递结构的地址(以指针的方式传递)
7.4等
注:结构体类型相当于基本数据类型(说三遍),结构体所具有的操作与基本数据类型所具有的操作类似,无论是结构体变量,指向结构体的指针,结构数组,向函数传递信息以及它们之间的结合运用都与基本数据类型相似(可以说一样)。
附加:链式结构,联合(union),枚举类型(enum),typedef(自定义类型) 等知识。
8.伸缩型数组成员
C99的一个特性:伸缩型数组成员,利用这项特性声明的结构,其最后一个数组具有一些特性
第一个特性:该数组不会立即存在。
第二个特性:使用该伸缩型数组成员可以编写合适的代码,就好像它确实存在并具有所需数目 元素一样。
声明一个伸缩型数组有如下规则
a.该成员必须是结构的最后一个成员
b.结构中至少有一个成员
c.该数组的声明类似于普通数组,只是它的方括号中是空的。
示例:
声明该结构变量时,不能用scores做任何事,因为没有给这个数组预留储存空间。
实际上,C99的意图是希望你声明一个指向struct flex类型的指针,然后用malloc()来分配足 够的空间,以储存struct flex类型结构的常规内容和伸缩型数组成员所需的额外空间。
例如,假设用scores表示一个内含5个double类型的数组,可以这样做:
带伸缩型数组成员的结构有一些特殊要求:
a.不能用结构进行赋值或拷贝
struct flex * pf1, * pf2;
*pf1 = *pf2 //不要这样做
这样做只会拷贝出伸缩型数组成员以外的其他成员,确实要拷贝,应使用memcpy()
b.不要以按值的方式把这种结构传递给函数,应传递该结构的地址
c.不要使用带伸缩型数组成员的结构作为函数成员或另一个结构的成员。