结构体与枚举
c语言使用结构体和数组表示聚合变量,数组要求元素类型一致,而结构体可以用来存储类型不一致的变量。结构体跟C++中的类很相似。
使用结构体能够很方便胡描述一个对象。
1.定义结构体
struct student_s { //student_s:标签
int number;
char name[25];
char gender;
int chinese;
int math;
int english;
};
2.学生结构体成员会有两个字节的填充、填充的目的是为了使数据项对其,方面CPU读取数据。
3.结构体初始化
Student_s s1 = {1,"yfg",'m',99,99,99};
Student_s s2 = {1}; //未初始化的成员会被赋值为0
3.结构体成员的访问:
s1.number = 99;
s1.number++;
4.结构体的赋值
s2 = s1;
结构体的赋值:表示将A内存空间的数据复制到B内存空间(A,B结构结构体)
Student结构体中具有数组,我们知道数组之间不能直接复制,那为什么在结构体中可以?
–>结构体之间的赋值是将A中的数据一一复制到结构体B中,所以当传递或者返回一个结构体时
都会导致结构体的复制,这回增加程序开销,为了避免这种情况应该传递结构体指针。
5.结构体指针
Student_s* stu = s1;
6.结构体指针的访问:C语言提供右箭头->用于结构体指针访问结构体成员
等价于: (*stu).name
stu->name;
stu->number;
//等价
(*stu).name
给结构体定义别名:使用typedef关键字给结构体类型定义别名
typedef struct student_s { //student_s:标签
int number;
char name[25];
char gender;
int chinese;
int math;
int english;
}Student;
定义别名时,标签省略。
枚举
在很多程序中,有些变量只能取一些离散的值。比如,扑克牌的花色只有 {黑桃、红 桃、梅花、方块}。显然,我们可以用 int 类型来表示这些值,为了增加代码的可读 性,我们还可以添加一些宏定义:
#define SUIT int
#define DIAMONDS 0
#define HEARTS 1
#define SPADES 2
#define CLUBS 3
SUIT s = HEARTS;
但是这种方式存在有一些问题:
-
没有显示地表明 DIAMONDS、HEARTS、SPADES、CLUBS隶属于同一种类型;
2如果离散值比较多,为每个值添加一个宏定义将会很繁琐;
3.预处理器会删除我们定义的名字:DIAMONDS、HEARTS、SPADES、CLUBS,所以 在调试的时候我们是没办法使用这些名字的。 因此,C 语言提供了一种特殊的类型——枚举类型,用来解决这些问题。也就是说枚 举类型是用来表示一些离散值的。
我们可以使用枚举:
枚举
1.定义枚举变量
enum Suit{
DIAMONDS,
HEARTS,
SPADES,
CLUBS
};
enum Suit s = HEARTS;//定义枚举类型的变量
2.给枚举变量起别名: 和结构体起别名一样
typedef enum{
DIAMONDS,
HEARTS,
SPADES,
CLUBS
}Suit;