尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【C语言7】构造数据类型

【C语言7】构造数据类型 文章目录7.构造数据类型7.1 结构体7.1.1 结构体的声明7.1.2 结构体变量定义、初始化、访问7.1.3 结构体的存储方式7.1.4 结构体作为函数参数传递7.1.5 结构体数组7.2 共用体联合体7.3 枚举类型7.4 typedef 关键字此处为C语言汇总版: 【C语言md编辑器版】从0基础开始到熟练掌握完整篇,共9部分7.构造数据类型基本数据类型shortintlongcharfloatdoublevoid指针类型* 基本数据类型构造数据类型结构体、共用体、枚举7.1 结构体7.1.1 结构体的声明声明struct 名称的结构体类型是一种数据结构。struct结构体名称{数据类型 成员1;数据类型 成员2;......};structdate//日期结构体{intyear;intmon;intday;};structdatetime{structdatemdate;structtimemtm;};注意1. 声明结构体的时候大括号{}后面的分号;一定不能忘记。2. 结构体成员之间用分号;隔开。3.struct后面的名称可以省略省略后就是一个匿名结构体。7.1.2 结构体变量定义、初始化、访问定义结构体类型 变量名;structdatemydate;声明结构体的同时定义了一个结构体变量即给定义的结构体取了一个名字。这个名字就代表这个结构体。structdate//日期结构体{intyear;intmon;intday;};初始化全局初始化structdatemydate{2026,8,6};部分初始化structdatemydate{.age21,};structdatetime{structdatemdate;structtimemtm;};structdatetimemdt{{2026,8,6},{14,2,23}};结构体数据成员的访问通过结构体变量变量名访问结构体变量名.结构体成员;//表达式结果取决于成员的数据类型。mdate.year;datetime.mdate.year;结构体中成员为结构体通过结构体指针访问需用结构体名称-成员了而不是结构体名称.成员。structdate//日期结构体{intyear;intmon;intday;};structdatetime{structdatemdate;//假设这两结构体已定义structtimemtm;};structdatemydate{2026,8,6};structdate*p1mydate;structdate*p2datetime;p1-year;p2-mdate.year;7.1.3 结构体的存储方式结构体存储的对齐原则1. 结构体成员在内存中存储时成员必须存储在自己字节大小的整数倍位置。2. 结构体整体占的内存大小时结构体中最大成员字节数的整数倍。structs2{chara;//2 (0-1)shortb;//2 (2-3)intc;//4 (4-7)};//64bit -- 24 //32bit 16structs3{chara;//4 (0-3)intb;//4 (4-7)shortc;//8 (8-15) //8-11longd;//8 (16-23) //12-15};//64bit 16 32bit 8structs4{chara;int*p;};注意1. 在不同位数系统下相同结构体在内存中占的字节空间大小可能不一样原因long在64位系统中占8位在32位系统中占4位。2. 可以强制让结构体按照指定字节数对齐。#pragmapack(1)structs{inta;//4charb;//1intc;//4};#pragmapack()7.1.4 结构体作为函数参数传递若要在被调函数中修改主调函数中的结构体变量则必须传递结构体变量的地址。若是仅在被调函数中使用主调函数中的结构体变量则既可传变量也可传地址。7.1.5 结构体数组定义struct名称 数组名[常量];初始化struct名称 数组名[3]{{},{},{}};访问 数组名[下标];//结构体变量7.2 共用体联合体语法声明union名称{数据类型 成员1;数据类型 成员2;......};定义union名称 变量名;特点1. 共用体中的成员共用一块内存空间2. 共用体在内存中占的字节数取决于最大字节数的成员。3. 共用体存储的数据与最后一次成员赋值有关。内存存储方式大小端小端内存的高地址存储高字节位内存的低地址存储低字节位大多数情景都采用小端存储。大端内存的高地址存储低字节位内存的低地址存储高字节位网络通信等采用大端方式存储。大小端测试方式指针方式intmain(void){inta0x11223344;char*p(char*)a;if(*p0x44){printf(small\n);}else{printf(big\n);}}共用体方式unionun{inta;charb;};intmain(){unionun temp;temp.a0x00000001;if(temp.b){printf(small\n);}else{printf(big\n);}return0;}7.3 枚举类型基本语法enum名称{枚举常量1//本质上就是一个整型常量,一般大写枚举常量2......};enumdays{MONDAY1,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY};intmain(){enumdaysday;intnum0;scanf(%d,num);switch(num){caseMONDAY:printf(today is monday\n);break;caseTUESDAY:printf(today is tuesday\n);break;caseWEDNESDAY:printf(today is wednesday\n);break;caseTHURSDAY:printf(today is thursday\n);break;caseFRIDAY:printf(today is friday\n);break;caseSATURDAY:printf(today is saturday\n);break;caseSUNDAY:printf(today is sunday\n);}return0;}注意1. 枚举里面的成员都是枚举常量都是整型常量所以不需要写数据类型。2. 枚举常量根据行业规范一般写成大写方式与普通变量区分开来。3. 枚举中的枚举常量类似于整型符号常量可以直接被引用。4. 枚举常量之间用逗号,隔开。5. 若枚举中的枚举常量没有给定初值则默认从0开始若给定初值则后面的常量以该值自增1。枚举变量enum名称变量名;枚举变量是枚举类型但本质是一个整形。 变量名枚举常量;7.4 typedef 关键字为已有的数据类型重命名。typedef已有的数据类型 新名字;typedefstructstu{charname[32];intage;}STU_s;structstu1{charname[32];intage;};typedefstructstu1STU1_s;typedefunsignedintu32;
返回列表