C语言结构体(struct)用法详解
粉丝问答
有个粉丝在群里问了这样一个问题,问题在图中已经标出,如下图。
DQuestsion
头文件的结构体的定义为: typedef struct{ u8 bmRequestType; u8 bRequest; u16 wValue; u16 wIndex; u16 wLength; }USB_Request_Header_t;
虽然粉丝最后都理解了,但是仍想趁着这个机会整理一下结构体的用法,希望能够对刚入行的童鞋们有所帮助。 结构体
在实际的开发过程中,一组数据往往具有不同的数据类型,此时数组是不能够满足需求了。因为数组中各元素的类型必须是一致的。为了解决这个需求,C中给出了另一种数据类型- 结构体 ,每一个成员可以是任意一种数据类型。
定义一个结构体的类型为: struct 结构名 { 成员列表 };
其中struct后面的叫做 结构体名 ,而struct 结构名 叫做结构体类型,只有结构体类型才可以定义变量,结构体名是不能定义变量的。注意} 后面是需要加; 的。 struct stu {XXX}; stu stu1; //fail struct stu stu1; //true三种结构体类型变量说明
结构变量有以下三种方式。 1. 先定义结构,再定义结构变量struct stu{ int age; }; struct stu stu1; //定义了变量stu12. 定义结构体类型的同时说明变量struct stu{ int age; }stu1;3. 直接说明结构变量struct { int age; }stu1;
这种方法和第一种方法相比,就是省略了 结构体名 ,而省略的结构体名,就无法组合结构体类型了,而无这种结构体类型,自然就不能再定义这种结构体类型的变量了。
这种结构体也被称为匿名结构体,即没有结构体名。匿名结构体通常作为结构体成员的一个变量去使用。如下: struct stu{ int age; struct { int month; }birthday; }stu1; sut1.birthday.month = 10; //用法结构体成员表示方法struct stu stu1, *pstu1; pstu1 = &stu1; stu1.age = 10; //true (&stu1)->age = 10; //true pstu1->age = 10; //true (*pstu1).age = 10; //true *pstu1.age = 10; //fail
如果对变量访问成员,则使用 . 运算符,如果是对指针访问成员则使用-> 运算符。
上例中除了最后一个都是对的。因为 . 运算符的优先级高于* ,所以会先执行pstu1.age ,而pstu1是一个指针,不可以使用. 运算符去访问,需要正确使用-> 运算符访问。所以最终会报错。 结构体指针做参数struct stu stu1; void fun(struct stu *val); fun(&stu1);
在这里也有新手误解的地方,在函数入参这一块,传入的是一个指针,并不是说外部一定要先定义一个指针变量 struct stu *xxx ,然后把xxx 传进去。就像下面一样。 struct stu stu1; struct stu *p_stu1 = &stu1; fun(p_stu1);结构体初始化定义变量的同时初始化struct stu{ int age; }stu1 = {18};先定义在初始化struct stu stu1,stu2; stu1.age = 18; stu2 = stu1; //结构体之间可以直接赋值常用初始化
在开发过程中,一个结构体之间会存在若干成员,极其复杂。这个时候通常是将成员全部清零,然后再对需要的成员进行构造。 struct stu stu1; memset(&stu1, 0 ,sizeof(stu1)); XXX_Init(&stu1.xxx);typedef与struct
常规定义结构体类型需要用 struct 结构名 的方式,比较繁琐。所以结构体定义往往与typedef相结合使用。
如果使用下面这种方法,结构体名我通常是省略的,因为我已经不打算使用struct方式定义变量了。 typedef struct _stu{ int age; }STU;
此时 STU 就等价于struct _stu ,只不过换了个名字。 struct _stu stu1; //true STU stu2; //true struct STU stu3; //fail,多了struct _stu stu4; //fail,缺少struct前置声明
在定义结构体的时候,往往会碰到这种情况,结构体成员中需要用到此结构体的类型。首先下面定义是正确的,如下: struct stu { int age; struct stu stu2; }stu1;
如果和typedef一块使用,然后用重新定义的类型。就需要前置声明。 typedef struct stu STU; struct stu{ int age; STU stu2; };
这样成员变量中就不用struct加结构体名的形式定义了,直接可以用STU定义所需变量。 结构体对齐
结构如何对齐呢,使用的是伪指令#pragma #pragma pack(push,2) typedef struct stu { char sex; int age; }STU; #pragma pack(pop)
2代表是以2个字节对齐的,此时sizeof(STU)等于6,因为sex为char型占1个字节,但是指定了两个字节对齐,所以分配给sex的内存实际有两个字节的空间。
注意字节对齐是以2的n次幂对齐的。即1、2、4、8等。不能是3字节对齐。
原文链接:C语言结构体(struct)用法详解
ROG愚人节整活首款游戏隐形眼镜,开启游戏新纪元IT之家4月1日消息,今天,ROG公布全球首款游戏隐形眼镜ROG智能眼镜。官方表示,使用这款产品,眨眼间即可制霸赛场,开启游戏新纪元,让世界成为你的游乐场。演示视频据ROG介绍,玩
苹果智能戒指,用途广泛果粉之家,专业苹果手机技术研究十年!您身边的苹果专家随着科技的发展,市面上涌现出各种奇思妙想的智能设备,种类繁多五花八门,而智能穿戴在其中扮演了非常重要的角色。科幻电影中的未来世界
疯子恶女人设太上头?郭晓婷顺德仙姬戏里大杀四方,戏外是软妹?编辑柠檬饼铛这姐一出场就看着不像善茬,捉了鲛人回家,不光要砍了他的尾巴为自己做漂亮裙子,还要鲛人来侍奉自己。世间万物都应该由自己支配,对她而言无用的东西就是废物人类早期虚无主义仙姬
季后赛开门红!广东后场三杰砍3816统治攻防,杜锋终于亮剑了CBA季后赛终于开启,广东宏远迎来同天津男篮的揭幕战,双方常规赛有过两次交手,广东宏远双杀对手。虽然天津依然是采用四节五人次的外援制度,但是球队整体实力毕竟还是更胜一筹的,上半场便
双胞胎兄弟6个月加辅食,一个吃米糊,一个吃肉泥,体检时差距大文菁妈中国06岁儿童营养发展报告指出,2010年612月龄的宝宝贫血患病率最高,农村儿童贫血患病率高达28。2!主要的原因就是辅食饮用不当。孩子为什么6个月后要添加辅食?最主要是这
孕期营养你补对了吗?生育一个健康聪明的宝宝,是所有准父母们的期望。科学的营养饮食不仅对胎儿的生长发育具有举足轻重的作用,对孕妇的健康也大有益处。怀孕后,很多孕妈在饮食上的观念是什么好,吃什么。但究竟孕
近期很是喜欢的朋友圈说说文案1分享日常是快乐,得到回应就快乐加倍2善良和喜欢都是免费的,但不是廉价的3成为更好的人,这是新的约定4最重要的是,与自己和解5真诚又坚定的喜欢永远让人心动6仅有一次的人生当然要活的
朋友圈晒娃文案1热爱生活,元气满满,都和你相关。2不期而遇的温暖,意料之外的浪漫。3平淡的岁月,你是唯一的亮点和光辉。4想让你快快长大,又害怕你马上长大。5尽我所能,护你一生,愿你平安顺遂。6岁
手机这4个开关最好关掉,否则耗电越来越快,还经常卡顿平时大家有没有这样的烦恼思考手机为什么耗电这么快?内存怎么又满了?这手机为什么这么卡?流泪其实只需要我们将手机中的几个设置关掉就可以让手机告别这些问题不但省电不卡顿还会更加省流量接
用阅读丈量世界,用历史点燃智慧专门写给孩子的历史书1。给孩子选历史书的难度众所周知,读历史很重要。我们人类之所以如此有智慧,很重要的一方面,是要归功于我们的历史教育。多少年来,我们从历史的纷繁事件中,汲取到了多少可贵的经验啊!这些
2018年官宣,2022年还没开机,迪丽热巴杨洋二搭,杨迪叫我干啥娱乐圈明星多次搭戏是非常普遍的事情,尤其是两家粉丝都很同意的情况下,角色又适合,那么二搭三搭甚至五搭就是家常便饭之事,比如之前说到的肖战和李沁,就搭过5次戏。今天要说的这两位明星,
穷人的两大困境没钱没心情文章来源一手烂牌(yslpdcwz)我平时很少看公众号的消息,有时要隔几个月才会看一次,所以有些读者给我发的公众号消息,等我看到基本已经过了好久了。其中有的说看完我的文章,很认同我
老年人,吃哪种降糖药比较好?医生解答建议简化糖尿病用药方案糖尿病正在成为老年人中最普遍的健康问题之一。2017年,全球65岁以上受试者的糖尿病患病率为1。23亿,预计到2045年这一数字会翻一番。糖尿病被认为是导致过早死亡和残疾的重要原因
女排主帅仍未敲定!3大顶级主帅默不作声,安家杰行为令球迷失望中国女排在东京奥运会赛场上遭遇了前所未有的失利,球迷们都记不清上一次中国女排在奥运会赛小组被淘汰是什么时候了。在整个女排历史上,都很少有这样糟糕的战绩,然而现实就是如此。主教练郎平
四连败!湖人惨遭太阳双杀,安东尼17分,保罗155,詹皇布克缺阵北京时间10月11日,NBA季前赛,湖人以94123不敌太阳,被对手双杀的同时吃到四连败。这场比赛詹姆斯和布克缺阵,太阳在第三节拉开比分差距,建立胜势,成功双杀湖人。威少此役12中
四连败,两大主控失误数得分,湖人94123惨败太阳刚刚结束的季前赛当中,湖人不敌太阳,遭遇4连败,太阳收获两连胜。湖人队此役詹姆斯轮休,霍顿塔克和蒙克因伤缺阵。太阳全主力出战。湖人第一节开始阶段威少4投1中,没有助攻,5失误,因为
太阳能电池用二硒化钨与二硫化钼半导体材料一样,二硒化钨(WSe2)也是一种典型的过渡金属半导体材料,因具有优良的电学光学性能以及高量子产率等特性,而深受太阳能电池研究者的欢迎。太阳能电池,是一种利用太
抵达柯伊伯带,探测器拍下真实画面!这就是太阳系边缘?宇宙中充满了神秘色彩,在好奇心的推动下人类踏进了宇宙世界。想要成功进入太空中就需要借助火箭和宇宙飞船的推动下才可以成功进入。为了探索很多关于宇宙的秘密,只有采用探测器的方式,探测器
江苏肯帝亚新赛季卧新尝胆期待质的变化20212022赛季中国男篮职业联赛(CBA)大幕即将拉开,江苏肯帝亚篮球俱乐部10日发布新赛季主题卧新尝胆。球队主教练李楠表示,经过上赛季的磨练,球队的年轻球员从个人能力到临场发
我怀念的红薯我偶尔听到别人说起山芋来,我左思右想的,就是不知道是什么东西。后来,我才知道红薯又叫白薯,甘薯,番薯,却不知道它还能叫地瓜,叫苕,叫山芋的,弄得我有些糊涂了。中国真是太大,各地方言
王者荣耀和lol手游打架,先死的一定是平安京了王者荣耀和lol手游打架,结果平安京快被打死了今天看了一下畅销榜,王者荣耀的确非常重视lol手游上线,活动就放了大招,返点券活动西游记猴子皮安琪拉漫画皮,猴子加安琪拉加送点券,无敌
肥胖儿童青春期长个儿比同龄人慢来源生命时报以往研究显示,肥胖儿童28岁时体重指数的增加与早期身高增加和青春期身高减少有关。德国莱比锡大学一项新研究显示,肥胖儿童体内激素分泌水平增高,也会促使其小时候长得高。研究