结构体到底是什么呀?!

📅 2026/7/5 4:09:50
结构体到底是什么呀?!
我们来思考一个问题如果我们要保存一个年级所有学生的信息我们该如何去做呢我们稍微回忆下以前我学过的知识大概能想到用数组去做因为学号啊姓名啊成绩啊都是同类元素的集合当然用数组了如果用单个变量真的会累死人呀但是再进一步思考发觉学生的信息还是有不少东西的比如学号姓名各科成绩电话家庭住址如果单单用数组是不是得好多好多数组呀而且这样呢管理起来也非常不方便啊那怎么办啊。其实呢在高级语言中有一种类型就是对基本类型进行重定义。把多个数据类型重新定义成一个新类型。就好比一栋房子里面有厕所啊厨房厨房里还有几颗白菜。如果我们想要表示你有一栋房子你可以把房子里面的东西全部都说一遍你还可以把这栋房子就用一栋房子去表示。厨房里的几颗白菜你可以想成放在数组里的因为几颗白菜是同类元素。一栋房子就相当于我们现在要学习的结构体。各种类型集合成一起呵呵这样的话你就可以用结构体去表示复杂的数据结构啦结构体成员变量的访问的思考我们再思考一个问题结构体是多种不同的数据类型的集合所以每个元素的大小都是不一样的那么如何访问结构体中的成员变量呢要是数组的话就好办因为是同类啊就以前学习的数组寻址公式一下子就访问到了很多人质疑那个寻址公式这个质疑很正常因为你还没有理解。这确实是一个问题呀不过等会应该就会有答案的结构体的定义结构体定义的关键字是 struct. 表示一个信息结构、后面跟着的是结构体的名称你定义成一个新类型了得起个名字呀就好比你现在造出了1个天使天使由哪些构成呢有天使的翅膀还有像人一样的天使还有白色的耀眼的裙子。还有天使的红色高跟鞋还有天使也许也有编号的吧不只它1个天使呵呵还有天使的名字。现在我们先来造人呵呵等以后厉害了再造天使造人structPerson{charname[64];//定长的名字如果这里给的类型是char * 就可以不定长了。但是用char *寻址要寻2次。用定长的话一次就到啦charsex;//性别intage;//int的age 应该够啦。活得够大啦floatheight;};大家仔细回忆QQ的年龄设置是不是每一年都得手动去改名字啊QQ不会自动给你改。这样是不是不太好啊因为每年都要去改年龄我们是不是应该分别定义年月日啊每次用当前年月日减去它的初始年月日这样的才好的啊因为这样无论在哪1年都知道一个人多大了的啊。比如现在我们做的学生信息管理系统要是每年都去改年龄是不是设计的不太科学啊所以我们这里要改1下但是QQ比较是人才济济的他们不会傻到这种地步啊那么它们为什么那这样的做呢我想主要是考虑到大量算的压力因为几亿QQ使用者一上线就要请求服务器做下减法呵呵这样服务器压力就大啊但是也可以放在客服端做的呀那为什么腾讯没有这样做呢不知道了慢慢地努力的学有一天会知道的。结构体和INT char其实是同一级别的我们来看这个例子struct stStudent //st前缀是一种规则你自己选择一种一直保持就好。char szName[64];int nYear;int nMonth;int nDay;注意1个问题啊现在我们只是定义了一种数据类型这里我们还没有产生变量哦它其实和int char 是一样的哦.只不过这里的结构体是一个符合类型。也就是这里没有分配内存的哦比如我们来看下面的错误程序正确的做法是先要声明这种类型的变量其实和int char声明变量是一样的。例如struct stStudent //st前缀是一种规则你自己选择一种一直保持就好。char szName[64];int nYear;int nMonth;int nDay;float fScore[3];int main(){stStudent.szName[0] ‘J’//这样是错误的哦这里就好比 int 123;相当于是对类型在赋值。}struct stStudent //st前缀是一种规则你自己选择一种一直保持就好。char szName[64];int nYear;int nMonth;int nDay;float fScore[3];int main(){stStudent stu;stu.szName[0] ‘J’}结构体变量的初始化和数组的初始化差不多stStudent stu {beyond,1989,2,11{99.987.3100}}其实呢还可以不要中间嵌套的那个括号为什么呢我们先来看看内存