结构体
先来说明一下,结构体存在的意义。比如说有一只猫,要在C语言程序中综合描述它,那么可以这样说,它的体重是float类型的,颜色是char类型的,它的一些食物名字是一个数组,那么如果分开定义这些变量,他们将是零散的,只能通过命名放我们看起来方便一些,但是C语言为我们准备的结构体变量便很好的解决了这个问题。
结构体的声明
struct book{
float price;
char title[MAXTI];
char author[MAXAU];
};
这样来看,一个要被描述的事物的多种属性便可以放在一起了。其中,struct 是关键字,book便是这种结构体布局的名称,其中的price,title成为成员变量,这是最基本的声明结构体的方式,当然很少被按部就班的这样做~先往下走着。
定义结构体变量
按照上面的声明方式,我们可以定义这样的一个结构体变量library,或者更多。
struct book library,book1,book2;
所以我们看到,这样定义结构体变量,就像之前的int char一样,,我们必须写上struct book,那我们可以这样
typedef struct book{
float price;
char title[MAXTI];
char author[MAXAU];
}BOOK;
所以我们声明结构体时如果用了typedef,定义结构体变量便可以简洁一些,甚至我们可以在声明时不写小写的book都可以,这应该是最常用的方式,也可用下面两种方式:
struct book{
float price;
char title[MAXTI];
char author[MAXAU];
}book1,book2; struct {
float price;
char title[MAXTI];
char author[MAXAU];
}book1,book2;
初始化结构体
可以在声明时直接赋值,初始化,也可以在定义结构体变量时初始化
struct book{
float price=22.3;
char title[MAXTI]="C Primer Plus";
char author[MAXAU]="Stephen Prata";
};
BOOK library={22.3,"C Primer Plus","Stephen Prata"};
也可以先定义,用之前再初始化,都是一样的。
访问结构成员
既然我们用结构体把某些变量聚集在了一起,那我们用这些变量时,当然要体现一下它所属的结构体
float money;
money = library.price;
用到成员变量时,必须要 结构体名称+ . +成员变量 ,这样才可以。
声明结构数组
struct book ar_library[MAXLIB];
数组ar_library代替了以前的变量名。这样定义便说明,ar_library的每个元素都是一个book类型的结构体,引用时要写清楚
float money;
monry=ar_library[].price;
在一些芯片的底层封装函数中,会用到结构数组的方式定义成批的寄存器,比较方便,直观。
指向结构的指针
float money;
typedef struct book{
float price;
char title[MAXTI];
char author[MAXAU];
}BOOK;
BOOK book1;
BOOK * pbook; //这就是一个指向结构的指针 pbook=&book1;
money = pbook->price;
这样便定义了一个指向结构的指针pbook,用到时先要把一个结构体变量的地址给指针,用的时候要 指针 -> 成员变量
个人认为指向指向结构的指针存在的意义在于传递结构体给函数时,让计算机不至于太累,编一个简单的程序体会一下
#include "stdio.h"
typedef stuct fund{
int a=;
int b=;
}NUM;
NUM num;
int sun(const stuct fund *);
int main(void)
{
printf("%d",sum(&num));
return ;
}
int sun (const struct fund *money)
{
return(money->a+money->b);
}
枚举
枚举类型用来声明符号来表示整形常量。字面理解好像不太直观。那就直接来看个应用的例子
enum spe{red,yellow,blue};//声明枚举
enum spe color; //定义枚举变量
enum是关键字,和结构体的 struct 很像,声明时就 enum+枚举类型名+{} ; ,其中的变量如果不初始化赋值,就从0开始往后加,在例子中,就是默认 red= 0,yellow=1,blue=2,当然也可以在声明时就赋值。定义枚举变量时,和结构体类似(typedef也可以仿照着用)。然后很重要的一点,定义枚举数组往往会有妙用,大家自行发掘。
所以我们可以看到,当一些变量有自己的意义时,我们用它的时候,就可以不用都#define,而是放到枚举中,它的名字就是它的值。而且在switch语句中,我们也可以很方便的调用。