跳到主要内容

结构体、联合

struct fish{
const char *name;
const char *species;
int teeth;
int age;
};
struct fish snappy = {"Snappy", "Piranha", 69, 4};
// const char*用来表示字符串常量,也就是字符串字面量
// 结构体赋值
struct fish snappy2 = snappy;
// 计算机会在内存中为结构体分配一块内存,然后将snappy的值复制到这块内存中
// 在c语言中,所有的赋值都会复制值,包括结构体,如果你想复制数据的引用,你需要使用指针
// 比如你将一个结构体传入一个函数,你需要使用指针,不然函数内部的修改不会影响到外部

创建别名

typedef struct fish{
const char *name;
const char *species;
int teeth;
int age;
} fish;
fish snappy = {"Snappy", "Piranha", 69, 4};

(*t).aget->age 是等价的,这是因为 -> 运算符是用来访问结构体指针的成员的,它是(*t).age的简写,*t.age是错误的,因为.运算符的优先级高于*运算符

联合

联合可以存储多种类型的数据,但是只能同时存储一种数据,它的大小是它的成员中最大的那个的大小

union variant{
int integer;
float real;
const char *string;
};

如何使用联合

union variant v;
v.integer = 42;
printf("%d\n", v.integer);
v.real = 3.14;
printf("%f\n", v.real);
v.string = "hello";
printf("%s\n", v.string);

联合的用途

联合的用途之一是节省内存,比如你有一个结构体,它有一个整型和一个浮点型,你可以使用联合来节省内存

struct data{
int type;
union{
int i;
float f;
} value;
};

枚举

枚举是一种用户自定义的数据类型,它是一组整型常量的集合,枚举的值是从 0 开始的,每个枚举值都是前一个枚举值的后继,枚举值可以是任意整型常量

enum primary_color {red, yellow, blue};
enum primary_color my_color;
my_color = red;