11 、结构体 一、枚举(enum) 1、常量符号化 enum colors { red , yellow , green };
枚举是一种用户定义的数据类型 ,用关键字 enum 声明:
enum 枚举类型名 { 名字0 , … , 名字n };
enum color { red , yellow , green };
void f ( enum color c );
int main ( void ) {
enum color t = red ;
scanf ( "%d" , & t );
f ( t );
return 0 ;
}
void f ( enum color c ) {
printf ( "%d \n " , c );
}
枚举量可以作为值 使用。 枚举类型可以用 enum 声明。 实际上内部以整数 存储与计算。 2、自动计数的枚举 enum COLOR { RED , YELLOW , GREEN , NumCOLORS };
这样在需要遍历所有枚举值 或用枚举量作数组下标 时会更方便。
3、枚举量的赋值 可以为枚举量指定具体值 :
enum COLOR { RED = 1 , YELLOW , GREEN = 5 };
后续未指定的成员自动递增。
Info
枚举比 const int 更简洁; 枚举比宏(#define)更安全,因为它具有类型检查特性。 二、结构(struct) 1、结构类型声明 struct date {
int month ;
int day ;
int year ;
}; // 注意分号
Tip
通常在函数外部声明结构类型 ,以便多个函数共用。
struct date {
int year ;
int month ;
int day ;
};
int main ( void ) {
struct date today ;
today . day = 10 ;
today . month = 12 ;
today . year = 2001 ;
printf ( "Today's date is %i-%i-%i. \n " , today . year , today . month , today . day );
return 0 ;
}
2、声明结构的三种形式 (1) 声明结构类型与变量分开:
struct point {
int x ;
int y ;
};
struct point p1 , p2 ;
(2) 无名结构:
struct {
int x ;
int y ;
} p1 , p2 ;
(3) 声明类型并同时定义变量:
struct point {
int x ;
int y ;
} p1 , p2 ;
Note
①与③都定义了结构类型 point, ②仅定义了结构变量,无类型名。
3、结构初始化 struct date today = { 7 , 31 , 2024 };
struct date today2 = { . month = 7 , . year = 2024 };
// 未赋值成员自动初始化为 0
4、结构成员访问 数组成员 :[] 访问 e.g. a[0] = 10; 结构成员 :. 访问 e.g. today.day = 31; 5、结构的运算 结构之间可以直接整体赋值 ,而数组不行:
p1 = ( struct point ){ 5 , 10 }; // 初始化
p1 = p2 ; // 整体复制
6、结构指针 结构变量名不是地址 ,必须显式取地址:
struct date today ;
struct date * pDate = & today ;
三、结构与函数 1、结构作为参数传递 int numberOfDays ( struct date d );
结构作为参数时,会在函数内复制一份完整结构 。
2、结构输入 scanf 不能直接一次性输入整个结构, 通常通过临时结构变量 输入,再整体返回。
3、结构指针作为参数 struct date myday ;
struct date * p = & myday ;
( * p ). month = 12 ; // 等价于:
p -> month = 12 ;
-> 用于访问指针指向的结构体成员 。
November 7, 2025 November 20, 2024