C的构造类型:结构体、枚举、联合体
前言:数组只能存储相同类型的数据,使用构造类型可以在一个结构中存储不同类型的数据还保持了数据的独立性;提高了信息处理的能力;
1 结构体 struct
1.1 基本结构体
1.1.1 结构体声明
struct Book{ char title[100]; float price; }; /*结构体定义表明了该结构体是如何存储数据的的形式,相当于一种数据类型struct Book;不是实体;*/ /*结构体声明不是函数定义,可以声明在函数内外,头文件中等;*/
1.1.2 结构体初始化
struct Book library={ "C Primer Plus ", 53.5 }; /*定义变量,并按顺序初始化*/ struct Book library1={ .price=35.5, .title="C Program" }; /*定义变量,并用初始化器初始化*/ struct Book{ char title[100]; folat price; } library1={"C Program",35.5}; /*声明结构体,并定义变量及初始化*/
1.1.3 结构体成员调用
printf("title:%s",library1.title ); /*成员运算符的优先级max,结构体成员与普通变量使用方法一样;汉字属于字符串;*/ /*如果一个结构体成员还是结构体,初始化或者调用的时候是使用结构体内的结构体的成员;要层级调用;*/
1.2 结构体数组:数组元素是结构体变量的数组;
1.2.1 声明
struct Book library3[100]; /*library3具有100个元素,每个元素都是一个struct Book类型的对象;*/
1.2.2 初始化
library3[0]={"book name",35.9};
1.2.3 调用
printf("book name == %s ", library3[0].title ); printf(" k == %s ", library[0].title[3] ); printf(" 35.9 == %.2f ", library3[0].price );
1.3 指向结构体变量的指针:传递的是结构体变量的起始地址
1.3.1 指向结构体的指针声明
/*先假设有两个结构体如下:*/ struct Friends{ char friend1[20]; char friend2[20]; }; struct Info{ char name[20]; int age; struct Friends connct_people }; struct Info ZHANGSAN={ "zhang san",24,{"lee si ", "wang wu"}}; /*声明一个指向struct Info类型的指针*/ struct Info * ptr_Info ; ptr_Info= &ZHANGSAN;
1.3.2指向结构体的指针调用
printf("name==zhang san %s ", ( * ptr_Info).name ); printf("age == %d" , ptr_Info -> age ); /* 结构体变量.成员 = (* 结构体指针).成员 = 结构体指针->成员 */ /*. 运算符和->运算符的优先级高于自加加运算符 */ ptr_Info->age++; //先取出age的值,使用后值加1; ++ptr_Info->age ; //取出age的值,值加1后使用; (++ptr_Info) ->age ; //先将指针移动至下一个结构体变量,然后使用age的值??应该是这个意思
1.4 结构体与函数参数的联系
1.4.1 使用结构体成员作为函数实参传递
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum(double total,double save_money) { return ( total+save_money ) ; } int main(void) { printf(" %.2f " , sum(David.bankfund , David.save ) ) ; }
1.4.2 使用指向结构体变量的指针 作为函数实参传递
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum( const struct Fund * money ) { return ( money->bankfund + (* money).save ) ; } /*传递的是指向结构体的指针,养成习惯给它加个const,防止数据串改;*/ int main(void) { printf(" %.2f " , sum( &David ) ) ; }
1.4.3 使用结构体变量 作为函数实参传递
#include<stdio.h> struct Fund{ double bankfund; double save; } David={300.2 , 400.3}; double sum( const struct Fund Struct_money ) { return ( Struct_money.bankfund + Struct_ money.save ) ; } /*传递的是指向结构体的指针,养成习惯给它加个const,防止数据串改;*/ int main(void) { printf(" %.2f " , sum(David ) ) ; }
1.4.4 结构体类型相同的变量可以互相赋值,并给新的相同类型的结构体变量初始化;(感觉并不值得特别指出,但是也不想丢弃的特性;)
1.4.5 位域 bit field
位域是一种特殊的结构体成员,结构体中的位域是按位存储的,方便资源紧张时利用内存;
//结构体位域的访问和结构体成员的访问相同,通过(.)点运算符实现;位域也可以同其他变量一起组成结构体使用; typedef struct{ uint8_t flag_bit1 :1; //位域宽度1,存储占用1bit内存 uint8_t :3; //位域宽度3,存储占用3bit内存; 该位不使用;作填充调整; uint8_t flag_bit5 :5; //位域宽度5,存储占用5bit内存 uint8_t flag_bit3 :1; //位域宽度1,存储占用1bit内存; 前面存储满了1byte内存,所以这里重新存储在1byte中; }TYPE_REQUEST_FLAG;
2 联合体 union:把几种不同类型的变量存放在同一段内存中,同一时刻的共用体变量只有一个值;
2.1 声明
union favorite{ int num; char fruit[20]; }; union favorite Bob="apple" ; /*创建并初始化了union favorite类型的变量Bob;*/ union favorite Bob= 8 ; /*重新初始化Bob对象为8;前面的apple被清除了*/ /*使用方法和struct相同,但是联合体基本用不上;*/
3 枚举 enum:用变量名来表示整型常量;
3.1 声明枚举类型
enum color {red, orange, yellow, green, blue,violet }; /*创建一个enum colorType的枚举类型 */ /*默认从0开始初始化,依次加1给下一个常量初始化;*/
3.2初始化枚举类型
enum color {red=1,yellow=3,blue = 5}; /*声明的同时初始化常量,常量初始化之后不可以在调用过程中修改;*/ enum color {red , yellow, blue =5, green }; /*red默认为0,yellow默认递增为1,blue为5,green递默认递增为6;*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?