Head First C 笔记 - 结构,联合与位字段

结构,联合与位字段

结构体,联合与位字段可以组合起来描述这个复杂的世界。

结构体

看例子学习:

#include <stdio.h>

typedef struct {
    const char *food;
} preferences;

typedef struct {
    const char *name;
    int age;
    preferences care;
} fish;

void inc_age(fish *f)
{
    // 效果相同
    (*f).age++;
    f->age++;
}

int main()
{
    fish snoppy = {"Snoppy", 4, {"Meat"}};
    inc_age(&snoppy);
    printf("%s - %i - %s", snoppy.name, snoppy.age, snoppy.care.food);
}

注意几点:

  • 使用typedef关键字创建结构别名
  • (*f).age != *f.age,因为*f.age == *(f.age),你懂的
  • (*f).age === f->age,这样更易读

联合,枚举与位字段

继续看案例:

#include <stdio.h>

// 枚举
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;
    unsigned int is_new:1; // 位字段,可节省空间
    quantity amount;
    unit_of_measure units;
} fruit_order;


int main()
{
    fruit_order apples = {"apple", "China", 1, .amount.weight=4.2, POUNDS};
    printf("%2.2f\n", apples.amount.weight);
    if (apples.units == POUNDS) {
        printf("bingo!");
    }
    return 0;
}

注意几点:

  • union用来定义一种叫"量"的类型,然后用户自己决定需要使用那个字段。p246
  • 当定义联合时,计算机只会为其中最大的字段分配空间
  • 由于我们不知道在联合中具体存了什么类型的值,这个案例中用枚举来标记了存储的类型
  • 位字段可以节省空间,位数可调

标签: c

添加新评论