结构体
位于Head First C 第220页:
struct fish {
const char *name;
const char *species;
int teeth;//牙齿
int age;
};
- 结构的大小固定
- 结构中的数据都有名字
struct fish snappy = {"Snappy","Piranha",69,4};
printf("Name = %s\n",snappy.name);
- 结构体和数组有些相像,但不能像数组那样取值。读取是只能
按名
访问。 - 在
定义结构
时,并没有让计算机在存储器只能够创建任何东西,只是割了计算机一个模板。 - 当
定义新的机构变量
时才会在存储器中为结构体创建足够大的空间。(位于Head First C
第226页的聚焦存储器中的结构
)
可以用typedef
为结构体命名(同样适用于联合、枚举):
位于Head First C 第232页:
typedef struct fish {
const char *name;
const char *species;
int teeth;//牙齿
int age;
}yue;
* `typedef`为结构创建别名,其实就是类型名,也就是说结构体有了两个名字,一个是结构名(`struct fish`),另一个是类型名(`yue`)。
这样初始化就可以写成这样:
yue snappy = {"Snappy","Piranha",69,4};
>* 用`typedef`定义结构时可以省略结构名
######结构体指针
位于Head First C 第240页:
>```
>(*t).age !=*t.age
>(*t).age == t->age
>```
***
#####联合 union:可以有效的使用存储空间
位于Head First C 第247页:
typedef union {
shot cunt;
float weight;
float volume;
} quantity;
当定义联合时,计算机只为其中一个分配空间,`quantity`的所有字段将保存在同一个地址。
联合的使用:
>######C89方式:
quantity q = {4};
//保存第一个字段的值,可以用这种方式。
>######指定初始化器:
quantuty q =(.weight=1.5);
`『指定初始化器』`也可以用来设定结构体字段的初值。
>######`"."`表示法:
quantity q;
q.volume = 3.7;
***
==联合中保存各种可能的值,但保存后没就无法知道它的类型了,所以一般需要创建`枚举`来一起使用==
#####枚举 enum
位于Head First C 第255页
enum colors {RED,GREEN,PUCE};
enum colors favorite = PUCE;
枚举变量中保存的实际是数字,所以枚举哦你过来保存符号.
==结构体和联合用`;`来分割数据项,而枚举用`,`==
***
#####结构体、联合、枚举一般是配合着使用:
位于Head First C 第258页
include
typedef enum {
COUNT,POUNDS,PINTS//计数、磅、品脱
} unit_of_measure;
typedef union {
short count;
float weight;
float volume;
} quantity;
typedef struct {
const char *name;
const char *country;
quantity amounat;
unit_of_measure units;
} fruit_order;
void display(fruit_order order)
{
printf("This order countais ");
if (order.units== PINTS)
printf("%2.2f pints of %s\n",order.amounat.volume,order.name);
else if (order.units == POUNDS)
printf("%2.2f lbs of %s\n",order.amounat.weight,order.name);
else
printf("%i %s\n",order.amounat.count,order.name);
}
int main()
{
fruit_order apple = {"apples","England",.amounat.count = 144,COUNT};
fruit_order strawberries = {"strawberries","Spain",.amounat.weight = 17.6,POUNDS};
fruit_order oj = {"orange juice","U.S.A",.amounat.volume = 10.5, PINTS};
display(apple);
display(strawberries);
display(oj);
return 0;
}
***
#####位字段(bitfield)
位于Head First C 第262页:
typedef struct {
unsigned int low_pass_vcf:1;
unsigned int filter_coupler:1;
unsigned int reverb:1;
unsigned int sequential:1;
} synth;
可以更有效的节省空间