Head First C 学习之结构体、联合、枚举、为字段(strcut、union、 enum、bitfield)

结构体

位于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;

可以更有效的节省空间

你可能感兴趣的:(Head First C 学习之结构体、联合、枚举、为字段(strcut、union、 enum、bitfield))