news 2026/5/23 11:18:30

结构体:程序员的第一块“自留地”

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
结构体:程序员的第一块“自留地”

接下来,让我们来到结构体的世界,当然关于结构体位段以及其余的相关知识,请关注我,可以了解后续,下面的是与程序学习相关的其它博客,有需要的可以点击,即可跳转对应博客

  • 关于C语言的基础见识
  • 分支与循环:选择向左,循环向右
  • 编程中的函数哲学:封装、调用与自我迭代
  • 数组:编程世界里的收纳大师
  • 操作符:程序世界的语法工具箱

1. 结构体类型的声明

前面我们在学习操作符的时候,已经学习了结构体的知识,这里稍微复习一下

1.1 结构体的回顾

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同的类型的变量

1.1.1 结构的声明
structtag{member-list;}variable-list;

当我们来描述一个学生时:

typedefstructStu{charname[20];//名字intage;//年龄charsex[5];//性别charid[20];//学号}Stu;//分号不能丢
1.1.2 结构体的变量的创建和初始化
#include<stdio.h>structStu{charname[20];//名字intage;//年龄charsex[5];//性别charid[20];//学号};intmain(){//按照结构体成员的顺序初始化structStus={"张三",20,"男","20230818001"};printf("name: %s\n",s.name);printf("age : %d\n",s.age);printf("sex : %s\n",s.sex);printf("id : %s\n",s.id);//按照指定的顺序初始化structStus2={.age=18,.name="lisi",.id="20230818002",.sex="女"};printf("name: %s\n",s2.name);printf("age : %d\n",s2.age);printf("sex : %s\n",s2.sex);printf("id : %s\n",s2.id);return0;}

1.2 结构的特殊声明

声明结构的时候,可以不完全的声明

//匿名结构体struct{inta;charb;floatc;}x;struct{inta;charb;floatc;}a[20],*p;

但这里,我们可以想想,如果:

p=&x;//可以完成赋值嘛?
  • 我在VS2022试了,生成解决方案和运行时没有出错
  • 但是尽量不要这样,编译器会把上面的两个声明当作完全不同的两个类型,所以是非法的
  • 匿名的结构体类型,没有对结构体重命名的话,基本上只能使用一次
1.3 结构的自引用
structNode{intdata;structNodenext;};
  • 如果用上述这种自引用,结构体的大小就会无穷的大,时不合理的
  • 所以,正确的自引用方式应当如下:
structNode{intdata;structNode*next;};

假如,结构体自引用的时候,加载了typedef对匿名结构体类型的重命名,可以运行看看是否可行呢:

typedefstruct{intdata;Node*next;}Node;

  • 明显不行,因为Node是对前面的你们结构体类型重命名产生的
  • 但是你们结构体内部却提前使用Node类型来创建成员变量,这是不可行的
  • 所以:定义结构体尽量不要使用匿名结构体
typedefstructNode{intdata;structNode*next;}Node;

2. 结构体的访问

通过点操作符(.)和(->)进行访问

  • 结构体变量访问成员通过(.)访问,其接受两操作数
structStu{charname[20];intage;};structStus;//访问s的成员intmain(){strcpy(s.name,"zhangsan");s.age=20;}
  • 结构体指针访问指向变量的成员
structStu{charname[20];intage;};voidprint(structStu*ps){printf("name = %s age = %d\n",(*ps).name,(*ps).age);//使用结构体指针访问指向对象的成员printf("name = %s age = %d\n",ps->name,ps->age);}intmain(){structStus={"zhangsan",20};print(&s);//结构体地址传参return0;}

3. 结构体传参

structS{intdata[1000];intnum;};structSs={{1,2,3,4},1000};//结构体传参voidprint1(structSs){printf("%d\n",s.num);}//结构体地址传参voidprint2(structS*ps){printf("%d\n",ps->num);}intmain(){print1(s);//传结构体print2(&s);//传地址return0;}
  • 上述的两种传参,我们最好选第二种,也就是Print2函数
  • 函数传参需要压栈,如果传递一个结构体对象时,结构体过大,就会导致参数压栈的系统开销大,从而导致性能下降
  • 通过指针访问就可以节省栈空间
  • 总而言之:结构体传参,传指针就完事了。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/23 3:54:12

喷漆房漆雾凝聚剂解决喷漆废水处理难题

在汽车制造、家具喷涂、机械加工等众多行业中&#xff0c;喷漆工艺是提升产品外观质量的关键环节。然而&#xff0c;喷漆过程中产生的漆雾废水却成为企业面临的一大环保挑战。这类废水含有大量漆雾颗粒、有机溶剂及重金属等污染物&#xff0c;若未经有效处理直接排放&#xff0…

作者头像 李华
网站建设 2026/5/23 11:18:03

盘点2025年最好用的【小说软件生成器】,第一款简直是卡文克星

都快2026年了&#xff0c;如果你还在电脑前枯坐一整晚&#xff0c;头发薅掉一大把&#xff0c;就为了憋出那该死的“黄金三章”&#xff1b;或者脑子里明明有个绝佳的脑洞&#xff0c;却因为理不清逻辑&#xff0c;写到二十万字就崩盘切书……那你真的该抬头看看天了。 作为一…

作者头像 李华
网站建设 2026/5/23 11:17:39

12月最全实测:2025年最好用的10款AI写小说工具(含避坑指南)

老实说&#xff0c;对于我们这种靠码字为生的写小说的人来说&#xff0c;这两年心情很复杂。一方面担心被取代&#xff0c;一方面又真香定律——毕竟谁没经历过在大纲面前坐一整晚只憋出三行字的绝望&#xff1f; 市面上打着ai写小说旗号的工具井喷&#xff0c;但很多都是“人…

作者头像 李华
网站建设 2026/5/23 0:54:15

EmotiVoice开源项目文档完整性评估与建议

EmotiVoice开源项目文档完整性评估与建议 在虚拟角色越来越需要“有温度的声音”的今天&#xff0c;传统的语音合成技术正面临一场深刻的变革。过去那种千篇一律、毫无情绪波动的机械音早已无法满足用户对沉浸式交互体验的期待。无论是游戏中的NPC对话&#xff0c;还是智能助手…

作者头像 李华
网站建设 2026/5/23 3:39:43

Kotaemon如何优化冷启动问题?预加载策略揭秘

Kotaemon如何优化冷启动问题&#xff1f;预加载策略揭秘 在企业级智能对话系统部署中&#xff0c;一个看似不起眼却影响深远的问题正在悄然发生&#xff1a;当用户第一次向客服机器人提问时&#xff0c;响应时间长达数秒——而后续的交互却快如闪电。这种“首问慢、后问快”的现…

作者头像 李华