结构体
定义:一些不同类型变量的集合。
数组:相同类型元素的集合。
结构体声明
struct tag//sturct 结构体关键字
{
member - list;//结构体成员
}varible-list;//变量列表
代码实操:
struct stu
{
char name[20];
char tele[12];
char sex[10];
int age;
}s4,s5,s6;//全局变量
struct stu s3;//全局变量
int main()
{
struct stu s1;//局部结构体变量
struct stu s2;//局部结构体变量
return 0;
}
匿名结构体类型
struct //sturct 结构体关键字
{
member - list;//结构体成员
}varible-list;//变量列表
结构体自引用
struct node
{
int data;
struct node* next;
};
对结构体类型重命名
typedef struct node
{
int data;
struct node* next;
}nod;//把原先node的结构体重新命名为nod
int main()
{
struct node n1;
nod n2;//两种方式都可以定义
return 0;
}
结构体变量的定义和初始化
struct s
{
char c;
int a;
double d;
char arr[20];
};
int main()
{
struct s s = { 'c',100,3.14,"hello" };
printf("%c %d %lf %s\n", s.c, s.a, s.d, s.arr);
return 0;
}
如果结构体中包含结构体
struct t
{
double b;
int age;
};
struct s
{
char c;
struct t st;
int a;
};
使用时应该是:
struct s s={'c',{55.6,30},100};
结构体内存对齐
结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
修改默认对齐数
# progma pack(4)//修改默认对齐数为4
#progma pack()//取消设置过的默认对齐数
offsetof(宏)
计算结构体成员相对于结构体开头的字节偏移量
struct s
{
char c;
int i;
double d;
};
int main()
{
printf("%d\n", offsetof(struct s, c));
return 0;
}//宏的参数可以传类型
结构体传参
必须传递地址
位段
结构体实现位段
结构体的声明和结构体是类似的,但有两个不同
1.位段的成员必须是int、unsigned int或 signed int
2.位段的成员名后边有一个冒号的一个数字
//位段
struct s
{
int a : 2;//:2表示a占了2个比特位
int b : 5;
int c : 10;
int d : 30;
};
sizeof(s)//8个字节
位段的内存分配
位段的空间上是按照需要以4个字节(int)或者1个字节(char)的方式来开辟的
位段存在的意义:节省空间
枚举
枚举是一种类型
enum sex
{
//枚举的可能取值
male,
female,
secret
};
int main()
{
enum sex s = male;
return 0;
}
给枚举常量赋值
enum sex
{
//枚举的可能取值
male=2,
female=4,
secret=8
};
enum sex s = male;
s = 5;
联合体
关键字:union
联合体也是一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员公用一块空间,联合变量的大小至少是最大成员的大小的整数倍。
union un
{
int i;
char c;
};
union un un;
un.c = 1;//赋值