目录
1.结构体的定义及使用
struct stu //stu若省略,则是匿名结构体,不能在外面定义结构体变量
{
char name[20];
int age;
char sex[5];
char id[20];
}t1,t2,*t3; //全局结构体变量, 结构体指针用来接收结构体变量的地址
void main()
{
struct stu t;//定义结构体变量
t.age = 19;
}
2.c++可以用定义类型的方式定义
typedef struct stu
{
char ch;
int age;
double d;
}stu;
void main()
{
stu s;//定义结构体变量可省略struct
}
3.结构体类型不同,指针不能接收
4.结构体内部不可以定义自身类型的变量
typedef struct stu
{
char ch;
int age;
double d;
struct stu t;//错的
}stu;
5.但是结构体内部可以定义自身类型的指针
原因是指针只开辟四或八个字节的空间
typedef struct stu
{
char ch;
int age;
double d;
struct stu *t;//OK
}stu;
6.结构体的初始化
typedef struct stu
{
char ch;
int age;
double d;
}stu;
void main()
{
struct stu t = { 'a', 100, 12.34 };
}
7.结构体内部嵌套结构体
typedef struct Date
{
int year;
int month;
int day;
}Date;
typedef struct Time
{
int hour;
int minute;
int second;
}Time;
typedef struct birthday
{
Date dt;
Time te;
}birthday;
void main()
{
birthday t;
t.dt.year = 2002;
}
8.⭐结构体内存对齐
字节对齐:减少访问次数,用空间换取时间
对齐方式:
1.了解每个类型自身的大小
2.自定义类型的自身对齐值(顺序不同,内存可能不同)(最好从小到大排列)
typedef struct stu
{
//字节对齐
char ch;//1+7
double d;//8
int age;//4+4
}stu;
void main()
{
printf("%d\n", sizeof(stu));//24
}
typedef struct stu
{
//字节对齐
char ch;//1+3
int age;//4
double d;//8
}stu;
void main()
{
printf("%d\n", sizeof(stu));//16
}
3.程序指定对齐值 #pragma pack(2)
#pragma pack(2)
typedef struct stu
{
//字节对齐
char ch;//1+1
int age;//4
double d;//8
}stu;
void main()
{
printf("%d\n", sizeof(stu));//14
}
4.自定义类型有效对齐值
指定对齐值不能超过原本的内存;若有歧义,按照较小的对齐值运行
#pragma pack(8)
typedef struct stu
{
//字节对齐
char ch;//1+3
int age;//4
double d;//8
}stu;
void main()
{
printf("%d\n", sizeof(stu));//16
}
9.练习1
typedef struct stu
{
short a;//2+6
struct//24
{
int o;//4+4
double b;//8
char s;//1 +7
};
int e;//4 +4
}stu;
void main()
{
printf("%d\n", sizeof(stu));//40
}
10.练习2
typedef struct stu
{
short a;//2+6
struct//56
{
int o[10];//40
double b;//8
char s;//1 +7
};
int e;//4 +4
}stu;
void main()
{
printf("%d\n", sizeof(stu));//72
}
11.练习3
#pragma pack(4)
typedef struct stu
{
short a;//2+2
struct//16
{
int o;//4
double b;//8
char s;//1+3
};
int e;//4
}stu;
void main()
{
printf("%d\n", sizeof(stu));//24
}
12练习4
#pragma pack(8)
typedef struct stu
{
int o;//4 + 4
struct//16
{
double b;//8
char s;//1+1
short a;//2+4
};
char e;//1 +7
}stu;
void main()
{
printf("%d\n", sizeof(stu));//32
}
#pragma pack(8)
typedef struct stu
{
int o;//4
struct t//0
{
double b;
char s;
short a;
};
char e;//1 + 3
}stu;
void main()
{
printf("%d\n", sizeof(stu));//8
}
13.练习5
struct s1//16
{
char c1;//1 +3
int i;//4
double d;//8
};
struct s2//8
{
char c1;//1
char c2;//1+2
int i;//4
};
struct s3//16
{
double d;//8
char c;//1 + 3
int i;//4
};
struct s4//32
{
char c1;//1 + 7
struct s3 s3;//16
double d;//8
};