拓冰建站拓冰建站
首页 / 资讯中心 / 正文

C语言总结 --- 构造数据类型

C 语言数据类型分为四大类基本数据类型short、int、long 、char、float、double、指针类型、构造数据类型结构体、共用体、枚举 、空类型 void一结构体1.声明结构体struct 名称{数据类型 成员1;数据类型 成员2;数据类型 成员3;};示例声明“struct 名称”的结构体类型是一种数据类型struct date{int year;int mon;int day;};struct time{int hour;int min;int sec;};struct datetime{int year;int mon;int day;int hour;int min;int sec;};struct datetime{struct date mdate;struct time mtm;};struct datetime{struct date{int year;int mon;int day;}mdate;struct time{int hour;int min;int sec;}mtm;};struct{int year;int mon;int day;};注意1声明结构体的时候结构体{}后面的“;”不能省略2结构体成员之间用“;”隔开3struct后面的“名称”可以省略省略后就是一个匿名结构体2.定义结构体变量int num;结构体类型 变量名;struct date mydate;struct{int year;int mon;int day;}mydate;声明结构体类型的同时定义了一个变量变量的变量名mydate3.初始化结构体1全部初始化struct date mydate {2007, 7, 7};struct datetime{struct date mdate;struct time mtm;};struct datetime mydt {{2007, 7, 7}, {14, 5, 23}};2部分初始化struct date mydate {.year 2024,.day 6,};4.访问结构体数据成员1通过结构体变量访问结构体成员结构变量变量名.成员1;结构变量变量名.成员2;结构变量变量名.成员3;结构变量变量名.成员1; //表达式的结果取决成员的数据类型mydate.year;mydate.mon;mydate.day;2通过结构体指针访问结构体成员结构体指针-成员1;结构体指针-成员2;结构体指针-成员3;结构变量变量名.成员1; //表达式的结果取决成员的数据类型5.结构体的存储方式1结构体对齐原则结构体成员在内存中存储时成员必须存储在自己字节大小的整数倍位置结构体整体占的内存大小是结构体中最大成员字节数的整数倍2注意在不同位系统下相同结构体在内存中占的字节空间可能不一样原因64位系统long/指针类型占8字节32位系统long/指针类型占4字节。可以强制让结构体按指定字节数对齐#pragma pack(1) //强制结构体按1字节对齐struct s{int a; //4char b; //1int c; //4};#pragma pack() //取消强制结构体按1字节对齐sizeof(s) ---9字节示例//12字节struct s1{short a;int b;char c;};//8字节struct s2{char a; //2 (0-1)short b; //2 (2-3)int c; //4 (4-7)};//64bit -- 24 //32bit--16struct s3{char a; //4 (0-3)int b; //4 (4-7)short c; //8 (8-15) //8-11long d; //8 (16-23) //12-15};//64bit 16 32bit--8struct s4{char a;int *p;};//24字节struct s5{char a[16]; //0-15char b; //16int c; //20-23};6.结构体作为函数参数传递如果要在被调函数中修改主调函数中的结构体变量则传递结构体变量的地址如果在被调函数中使用主调函数中定义的结构体变量可以值传递也可以传地址7.结构体数组struct 名称 数组名[元素个数];struct 名称 数组名[元素个数] {{} {} {}};数组名[下标]; ---》数据类型”struct 名称“ 类型结构体数组中的成员访问struct stu ss[4] {{zhangsan, 23, 90}, {lisi, 22, 67},{wanger, 24, 89}, {zhaowu, 20, 99}};void printf_stu_array(struct stu *ss, int len){for (int i 0; i len; i){//struct stuprintf(%s %d %d\n, ss[i].name, ss[i].age, ss[i].score);//struct stu *printf(%s %d %d\n, (ssi)-name, (ssi)-age, (ssi)-score);//struct stuprintf(%s %d %d\n, (*(ssi)).name, (*(ssi)).age, (*(ssi)).score);}}二共用体1.基本语法声明共用体union 名称{数据类型 成员1数据类型 成员2数据类型 成员3}定义共用体变量union 名称 变量名特点1共用体中的所有成员共用一块内存空间2共用体在内存中占的字节数取决于最大字节数的成员3共用体存储的数据和最后一次的成员赋值有关。2.内存大小段存储方式小端内存的高地址存储高字节位内存的低地址存储低字节位大端内存的高地址存储低字节位内存的低地址存储高字节位大小端测试方式指针方式int main(void){int a 0x11223344;char *p (char *)a;if (*p 0x44){printf(small\n);}else{printf(big\n);}}共用体方式union s{int a;char b;};int main(void){union s tmp;tmp.a 1;if (tmp.b){printf(small\n);}else{printf(big\n);}return 0;}三枚举基本语法枚举类型的声明enum 名称{枚举常量1枚举常量2枚举常量3}#define RED 0#define BLUE 1符号常量注意枚举里面的成员都是枚举常量都是整形常量所以不需要写数据类型枚举常量根据行业规范一般写成大写方式和普通变量区分枚举中的枚举常量类似于整形符号常量可以直接被引用枚举中的常量和常量之间用逗号隔开枚举中的枚举常量如果没有给定初始值则默认从0开始如果给其中的某个枚举常量给定了初始值则后面的常量以该值为基础自增1枚举变量enum 名称 变量名枚举变量是枚举类型但本质是一个整型变量名 枚举常量四typedef关键字typedef为已有的数据类型重命名typedef 已有的数据类型 新名字typedef enum week{MON 1,TUE,WED,THU,FRI,SAT,SUN,}WEEK_e;typedef struct stu{char name[32];int score;}STU_s;struct stu1{char name[32];int score;};typedef struct stu1 STU1_s;typedef union name{char a;int b;short c;}NAME_u;typedef unsigned int u32;typedef unsigned short u16;typedef unsigned char u8;typedef unsigned long u64;typedef signed int s32;
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门