粉丝问答群里有粉丝问了这样一个问题,问题已经在图片中标注出来了,如下图。DQuestsion头文件的结构体定义为:typedefstruct{u8bmRequestType;u8b请求;u16w值;u16w索引;使用方法,希望对刚入行的童鞋有所帮助。在结构体的实际开发过程中,往往一组数据有不同的数据类型,此时数组就不能满足要求。因为数组中每个元素的类型必须一致。为了解决这个需求,C中给出了另一种数据类型——结构体,每个成员可以是任何数据类型。定义一个结构的类型为:structstructurename{memberlist};其中struct称为结构名,struct结构名称为结构类型。只有结构类型可以定义变量,结构名称不能定义变量。的。注意;需要在}之后添加。结构stu{XXX};stustu1;//失败结构stustu1;//true三个结构体类型变量表示该结构体变量有以下三个方法。1.先定义结构体,再定义结构体变量structstu{intage;};structstustu1;//定义变量stu12。定义结构类型,同时解释变量:structstu{intage;}stu1;3。直接解释结构体变量:struct{intage;}stu1;与第一种方法相比,这种方法省略了结构体名称,省略的结构体名称不能结合没有这种结构体类型的结构体类型,自然也就不能再定义这种结构体类型的变量了。这种结构也称为匿名结构,即没有结构名称。匿名结构通常用作结构成员的变量。如下:structstu{intage;结构{int月;}生日;}stu1;sut1.birthday.month=10;//使用结构体成员表示方法structstustu1,*pstu1;pstu1=&stu1;stu1.age=10;//真(&stu1)->age=10;//truepstu1->age=10;//真(*pstu1).age=10;//真*pstu1.age=10;//如果是则失败对于变量访问成员,使用.运算符,对于指针访问成员,使用->运算符。上面的例子除了最后一个以外都是正确的。因为.运算符高于*,pstu1.age会先执行,而pstu1是一个指针,不能用.运算符,需要正确使用->运算符才能访问。所以最终会报错。结构体指针作为参数structstustu1;voidfun(structstu*val);fun(&stu1);这里也有新手的误区。在函数入口参数中,传入了一个指针,并不是说外部必须先定义一个指针变量structstu*xxx,然后将xxx传入其中。就像下面一样。结构stustu1;结构stu*p_stu1=&stu1;fun(p_stu1);在初始化structstu{intage;}stu1={18};的同时初始化结构并定义变量在初始化中先定义structstustu1,stu2;stu1.age=18;stu2=stu1;//结构体可以直接赋值普通初始化在开发过程中,一个结构体之间会存在若干个成员,极其复杂。这时候通常会清空所有的成员,然后构造需要的成员。结构stustu1;memset(&stu1,0,sizeof(stu1));XXX_Init(&stu1.xxx);typedef和struct常规定义结构类型需要使用struct结构名,比较麻烦。所以结构定义经常和typedef结合使用。如果使用下面的方法,我通常会省略结构体名称,因为我不打算使用结构体方法来定义变量。typedefstruct_stu{intage;}STU;此时STU相当于struct_stu,只是换了个名字。结构_stustu1;//真STUstu2;//truestructSTUstu3;//失败,更多的struct_stustu4;//失败,缺少struct预声明在定义结构体时,经常会遇到这种情况,structure成员中需要使用到的这个结构体的类型。首先,下面的定义是正确的,如下:structstu{intage;结构stustu2;}stu1;如果与typedef一起使用,则使用重新定义的类型。需要提前声明。typedefstructstuSTU;structstu{intage;STUstu2;};这样就不需要用struct加结构名的形式定义成员变量,直接用STU定义需要的变量即可。结构对齐如何对齐结构,使用伪指令#pragma#pragmapack(push,2)typedefstructstu{charsex;intage;}STU;#pragmapack(pop)2表示2个字节对??齐,此时sizeof(STU)等于6,因为sex是占1个字节的char类型,但是指定了两个字节对齐,所以分配给sex的内存实际上有两个字节的空间。注意字节对齐是2的次方对齐。即1、2、4、8等。不能3字节对齐。
