1、结构体
1.结构体的定义与初始化
结构体类型定义:
struct 结构体名{
变量类型1 变量1名,
变量类型2 变量2名,
变量类型3 变量3名,
…
};
//例:
struct student{
char name[32],
char sex,
int age,
int score,
};
结构体变量定义:
存储类型 变量类型 变量名;
(auto) struct student stu;
结构体初始化
没有被赋予初值的变量默认为0
//全部初始化
struct student stu ={
{"zhangsan",'m',18,100}
};
//局部初始化
struct student stu = {
.name = "zhangsan",
.score = 100,
};
2.结构体变量的访问
结构体访问变量的类型最终由结构体成员的变量决定
运算符 | 功能 | 表达形式 |
. | 结构体变量类型访问成员变量 |
stu.name = "zhangsan" stu.sex = 'm' |
-> | 结构体指针变量访问成员变量 |
stu -> name = "zhangsan" stu -> sex = 'm' |
3.结构体的存储
结构体成员必须存储在自身大小整数倍的空间内
结构体所占存储空间为最大成员所占空间大小的整数倍
以下结构体为例,说明该结构体存储所占空间大小为1{char} + 2(short) + 1(不存放数据)(必须存储在自身大小整数倍的空间内) +4(int)= 8
struct text{
char a;
short b;
int c;
};
4.结构体数组
//结构体数组定义格式
数据类型 数组名[元素个数];
//结构体数组的初始化
//全部初始化
struct student s[3] = {
{"zhangsan", 'm', 19, 100},
{"lisi", 'f', 18, 90},
{"wanger", 'm', 19, 60},
};
//局部初始化
struct student s[3] = {
[1] = {
.name = "zhangsan",
.score = 90,
},
};
5.结构体的参数传递
值传递、地址传递与结构体数组参数传递
//值传递
void fun(struct student tmp);
//地址传递
void fun(struct student *ptmp);
//结构体数组传参 len为元素个数
int fun(struct student *pstu, int len);
2、共用体(联合体)
- 结构体成员变量空间是独立的
- 共用体每个变量空间是共享的
- 共用体所占空间大小等于共用体最大成员所占空间大小
数据类型定义:
union 共用体名{
变量类型1 变量名1,
变量类型2 变量名2,
变量类型3 变量名3,
…
};
内存大小端:
概念 | 含义 |
内存小端 | 高地址存放高位数据,低地址存放低位数据的存储方式 |
内存大端 | 高地址存放低位数据,低地址存放高位数据的存储方式 |
利用共用体判别内存大小端
union s { //共用体共用存储空间
char a; //char类型位于低位
int b;
};
int main(void)
{
union s s1;
s1.b = 1;
if(s1.a)
printf("小端存储\\n"); //低地址存低位数据
else
printf("大端存储\\n"); //高地址存放高位数据
return 0;
}
3、枚举
- 作用:定义一些枚举常量,在该枚举类型下,只能取得枚举成员中的变量
- 枚举常量均为int类型,且第一个枚举常量的值默认为0,后续枚举常量的值总是前一个常量的 值+1
- 枚举常量可以在定义时被赋值
定义形式:
enum 枚举类型 {
常量1,
常量2,
常量3,
…
};
枚举的运用:
enum weekday {
MONDAY = 1,
TUESDAY,
WEDNESDAY,
THURDAY,
FRIDAY,
SATURSDAY,
SUNDAY,
};
int main(void)
{
enum weekday day;
printf("请输入今天是周几:\\n");
scanf("%d", (int *)&day);
switch (day)
{
case MONDAY:printf("尾号1和6限行\\n");break;
case TUESDAY:printf("尾号2和7限行\\n");break;
case WEDNESDAY:printf("尾号3和8限行\\n");break;
case THURDAY:printf("尾号4和9限行\\n");break;
case FRIDAY:printf("尾号5和0限行\\n");break;
case SATURSDAY:
case SUNDAY:
default:printf("不限行\\n");break;
}
return 0;
}
评论前必须登录!
注册