结构体到底是什么呀?!
我们来思考一个问题,如果我们要保存一个年级所有学生的信息,我们该如何去做呢!我们稍微回忆下以前我学过的知识,大概能想到用数组去做,因为学号啊,姓名啊,成绩啊,都是同类元素的集合,当然用数组了,如果用单个变量真的会累死人呀!但是再进一步思考发觉,学生的信息还是有不少东西的,比如学号,姓名,各科成绩,电话,家庭住址,如果单单用数组,是不是得好多好多数组呀!而且这样呢,管理起来也非常不方便啊,那怎么办啊。其实呢!在高级语言中,有一种类型,就是对基本类型进行重定义。把多个数据类型重新定义成一个新类型。就好比一栋房子,里面有厕所啊,厨房,厨房里还有几颗白菜。如果我们想要表示你有一栋房子,你可以把房子里面的东西全部都说一遍,你还可以把这栋房子就用一栋房子去表示。厨房里的几颗白菜你可以想成放在数组里的,因为几颗白菜是同类元素。一栋房子就相当于我们现在要学习的结构体。各种类型集合成一起,呵呵,这样的话,你就可以用结构体去表示复杂的数据结构啦!
结构体成员变量的访问的思考
我们再思考一个问题,结构体是多种不同的数据类型的集合,所以每个元素的大小都是不一样的,那么如何访问结构体中的成员变量呢!要是数组的话就好办,因为是同类啊,就以前学习的数组寻址公式一下子就访问到了(很多人质疑那个寻址公式,这个质疑很正常,因为你还没有理解)。这确实是一个问题呀!不过,等会应该就会有答案的!
结构体的定义
结构体定义的关键字是 struct. 表示一个信息结构、后面跟着的是结构体的名称,你定义成一个新类型了,得起个名字呀!就好比,你现在造出了1个天使,天使由哪些构成呢,有天使的翅膀,还有像人一样的天使,还有白色的耀眼的裙子。还有天使的红色高跟鞋,还有,天使也许也有编号的吧,不只它1个天使,呵呵!还有天使的名字。现在我们先来造人,呵呵!等以后厉害了再造天使:
造人:
|
大家仔细回忆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.9
87.3
100
}
}
其实呢,还可以不要中间嵌套的那个括号,为什么呢,我们先来看看内存:
