StdC--12 结构体
Hightlight
1 预处理
2 结构体
3 联合
1. 预处理
1 #include <stdio.h> //从系统目录查找stdio.h 2 #include "01test.h" //从当前目录中查找01test.h文件 3 4 int main() 5 { 6 return 0; 7 }
1.2 #define 和 typedef 一点小区别
--> typedef 专门给数据类型起别名
如果不用typedef的话 那么每次初始化一个结构体类型变量时候要用
struct <str_name> <str_name1>
--> 当给结构体起别名时候不能用#define
--> 通常格式:
typedef struct { float shen_gao; int nian_ling; char xing_bie; }ssren; ssren ren4={180.1, 28, Male};
1 #include <stdio.h>
2 struct sren{ //结构体可以放在头文件中
3 float shen_gao;
4 int nian_ling;
5 char xing_bie;
6 }ren1;
7
8 typedef struct sren sren; //typedef 一般给数据类型起名字
9
10 #define PINT int*
11
12 int main()
13 {
14 struct ren{
15 float shen_gao;
16 int nian_ling;
17 char xing_bie;
18 };
19 PINT p_shu_zi=NULL, p_shu_zi_1=NULL;
/*
如果gcc -E
int* p_shu_zi=((void *)0), p_shu_zi_1=((void *)0);
如果使用typedef就不会出现类似问题
*/
20
21 }
2. 结构体
2.1 一般而言结构体可以放在头文件里声明。
1 #include <stdio.h> 2 int main() 3 { 4 struct ren{ //没有声明变量知识描述了变量和结构体的关系 5 float shen_gao; 6 int age; 7 char gender; 8 }ren1; 9 10 struct ren ren2={1.78,20,'F'}; //结构体声明和初始化 11 printf("%g\n",ren2.shen_gao); 12 printf("%d\n",ren2.age); 13 printf("%c\n",ren2.gender); 14 15 return 0; 16 17 }
2.2 结构体作为函数参数返回值
-->结构体变量可以作为函数的参数返回值使用 --效率低
-->但是最好使用结构体变量的地址(指针)而不是结构体本身
e.g 通常情况下 不推荐结构体作为函数参数的返回值 效率低
#include <stdio.h> typedef struct sren{ float shen_gao; int nian_ling; char xing_bie; }ren; ren du(){ //当返回时 返回的是结构体的复制 所以复制时间非常长 效率低 //通常不把结构体当做返回值 效率低 ren ren2={0.0f,0,0}; scanf("%g %d %c",&ren2.shen_gao,&ren2.nian_ling,&ren2.xing_bie); return ren2; } int main () { ren ren1={0.0f,0,0}; ren1=du(); printf("shen_gao=%g\nnian_ling=%d\nxing_bie=%c\n",ren1.shen_gao,ren1.nian_ling,ren1.xing_bie); getchar(); return 0; }
2.3 解决返回结构体参数的效率低问题
--->作为函数参数返回结构体地址
1 #include <stdio.h> 2 typedef struct sren{ 3 float shen_gao; 4 int nian_ling; 5 char xing_bie; 6 }ren; 7 8 ren* du(ren* p_ren){ 9 10 scanf("%g %d %c",&p_ren->shen_gao,&p_ren->nian_ling,&p_ren->xing_bie); 11 return p_ren; 12 13 } 14 15 int main () 16 { 17 ren ren1={0.0f,0,0}; 18 ren *p_ren=NULL; 19 p_ren=du(&ren1); 20 21 printf("shen_gao=%g\nnian_ling=%d\nxing_bie=%c\n",p_ren->shen_gao,p_ren->nian_ling,p_ren->xing_bie); 22 23 24 return 0; 25 }
2.4 结构体的对其和补齐
--> 字节对齐:是指计算机再分配变量地址时候必须让手字节地址能被变量的大小整除,如果变量大小超过4个字节按4个4字节计算
--> 字节补齐:补齐结构体的大小必须是其中最大变量的大小的整数倍,如果变量大小孤傲过4个字节 按照4个字节计算
--> 对结构体sizeof的结果: 结果为8
1 #include <stdio.h> 2 3 typedef struct{ // 8字节 4 char zi_fu; 5 char zi_fu_1; 6 int shu_zi; 7 }jie_gou; 8 9 typedef struct{ //8字节 10 int shu_zi; 11 char zi_fu; 12 char zi_fu_1; 13 }jie_gou1; 14 15 typedef struct{ //12字节 16 char zi_fu; 17 int shu_zi; 18 char zi_fu_1; 19 }jie_gou2; 20 21 22 int main() 23 { 24 printf("sizeof(jiegou)= %d\n",sizeof(jie_gou)); 25 printf("sizeof(jiegou)= %d\n",sizeof(jie_gou1)); 26 printf("sizeof(jiegou)= %d\n",sizeof(jie_gou2)); 27 return 0; 28 }
2.4 结构体的位域练习
3. 联合
3.1 联合包括多个基本变量声明,都从一个地址开始分配,代表了对同样一组字节的不同使用方式。
3.2 大小端描述了计算机存储数字的顺序
小端值得是把数字的最低位存在地址最小的字节中
大端值得是把数字的最好为存在地址最小字节中
1 #include <stdio.h> 2 3 union lian_he{ 4 int shu_zi; 5 char zi_fu[4]; 6 }lian_he_1; 7 8 int main() 9 { 10 printf("sizeof(lian_he_1)=%d\n",sizeof(lian_he_1)); 11 printf("%p %p \n", &lian_he_1.shu_zi, &lian_he_1.zi_fu[0]); //首地址相同 12 13 lian_he_1.shu_zi=0x12345678; 14 printf("%x\n",lian_he_1.zi_fu[0]); //小端排序 15 16 return 0; 17 }
3.3 网络上所有数据按照大端方式存储,称为网络字节顺序。
4. 枚举基本类型
1 #include <stdio.h> 2 3 int main() 4 { 5 enum ji_jie {SPR,SUM,AUT=6,WIN}; 6 printf("SPR is %d\n",SPR); 7 printf("win is %d\n",WIN); 8 enum ji_jie season; 9 season=SUM; 10 printf("season is %d\n",season); 11 return 0; 12 }