一、结构体
1.结构体的声明及定义:
(1)声明一个student的类型
struct student
{
char name[20];
int age;
char sex[5];
char id[20];
};
struct student std1;// 定义结构体变量std1
(2)用typedef 对结构体声明
typedef struct student
{
char name[20];
int age;
char sex[5];
char id[20];
}student;
student std1;//定义结构体变量std1
2.结构体的初始化和成员访问
(1)结构体初始化
struct student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
(2)结构体的成员访问
typedef struct student
{
char name[20];
int age;
char sex[5];
char id[20];
}student;
int main()
{
student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
printf("%s %d %s %s\n", std1.name, std1.age, std1.sex, std1.id);//结构体访问
system("pause");
return 0;
}
利用结构体指针访问成员变量:
定义结构体指针指向定义的std1,通过指针对结构体成员进行访问。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
//struct student
//{
// char name[20];
// int age;
// char sex[5];
// char id[20];
//};
typedef struct student
{
char name[20];
int age;
char sex[5];
char id[20];
}student;
int main()
{
student std1 = { "zhangsan", 20, "nan", "1758962312" };//初始化
//printf("%s %d %s %s\n", std1.name, std1.age, std1.sex, std1.id);
student* ps = &std1;
printf("%s %d %s %s\n", ps->name, ps->age, ps->sex, ps->id);
system("pause");
return 0;
}
3.结构体内存对齐
- 第一个成员在与结构体变量偏移量为0的地址处。
- 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
Linux中的默认值为4 - 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
- 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所 有最大对齐数(含嵌套结构体的对齐数)的整数倍。
二、共用体(联合体)
联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间(所以 联合也叫共用体)
(1)联合体声明及定义
union Un
{
char c;
int i;
};
//联合变量的定义
union Un un;
//计算连个变量的大小
printf("%d\n", sizeof(un));
从输出的大小可以看出各个成员共用一个内存空间
(2)联合体应用举例
判断当前机器的大小端问题:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int check_sys()
{
union
{
int i;
char c;
}u;
u.i = 1;
return u.c;
}
int main()
{
if (check_sys() == 1)
printf("小端\n");
else
printf("大端\n");
system("pause");
return 0;
}
(3)联合大小的计算
联合的大小至少是最大成员的大小。
当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
union Un1
{
char c[5];
int i;
};
union Un2
{
short c[7];
int i;
};
int main()
{
printf("%d \n", sizeof(union Un1));
printf("%d \n", sizeof(union Un2));
system("pause");
return 0;
}