struct解
- 具有相同,和不同类型的集合
# define NUM 64
// 定义结构体,本质是制作类型
struct stu {
char name[NUM / 2];
int age;
char sex;
char addr[NUM];
}a,b,c;
int main()
{
return 0;
}
- 结构体使用
- 结构体只能被整体初始化,不能被整体赋值
- struct str x;x = {1,2,3};错误操作
- c中空结构体是不允许定义的,至少一个成员。在vs中,不同的编译器编译不同gcc 是0.
柔性数组
- 柔性数组的定义
- 柔性数组的使用
- 必须放在结构体内
struct stu {
int age;
char name[20];
int arr[];// 尽量第一个不要使柔性数组,放最后
};
int main()
{
struct stu* p = malloc(sizeof(struct stu) + sizeof(int) * 10);
p->age = 16;
for (int i = 0; i < p->age; i++)
{
p->arr[i] = i;
}
return 0;
}
联合体union
- 空间是共享的但是空间大小以最大类型为准。
- 可以使用点操作符 ,指向操作符
- 联合体内,起始地址都是一样的
union MyUnion
{
int a;
char b;
};
int main()
{
union MyUnion x ;
union MyUnion* p = &x;
p->a;
return 0;
}
// ---------------------------------------------------------------
union MyUnion
{
int a;
char b;
};
int main()
{
union MyUnion x ;
printf("%p \n", &x);
printf("%p \n", &(x.a));
printf("%p \n", &(x.b));
// 地址相同 证明联合体按照最大字节变量开辟
// b永远在a的低地址处
// 每一个都是第一个元素
// 从低地址处向高地址开辟空间
return 0;
}
// ---------------------------------------------------------------
union MyUnion
{
int a;
char b;
};
int main()
{
union MyUnion x ;
x.a = 16;
printf("%d",x.b);// 16 小端
return 0;
}
//-------------------------------------------------------------
union MyUnion
{
int a;
char b[4];
}*p,u;
int main()
{
p = &u;
p->b[0] = 0x44;
p->b[1] = 0x45;
p->b[2] = 0x46;
p->b[3] = 0x47;
printf("%x \n", p->a);
// 47 46 45 44
return 0;
}
枚举enum
- 枚举是枚举的常量,常量之间隔开
- 具有代码的字描述型
- 现实中有一大批相关的常量需要描述出来
enum color
{
RED,
YELLOW,
BLACK
};
int main()
{
enum color r = RED;
return 0;
}
typedef与#define比较
- 他们两个在处理类型的方面 宏是在预处理时文本替换原则。
- typedef 类型重命名,形成新的类型时,会有统一的重命名,不是简单的替换。
typedef int* u_int;
int main()
{
u_int a, b;
// 类型重命名 后面的全部该改变
return 0;
}
// -------------------------------------------------------------
#define ptr_t int *
int main()
{
ptr_t a, b;
// 这里是替换
return 0;
}