和小白一起学数据结构(三)
今天博主动笔有些晚了哈,所以不讲太多废话了,直接上干货!
今天我们来复习c语言提供的两种聚合数据类型(aggregate data type):数组和结构,其中之一“结构”。今天的第一个复习问题来了,什么是聚合数据类型?聚合数据类型,顾名思义就是将具有某一共同属性的数据通过特定方式或者结构结合起来,简言之,就是能够同时存储超过一个的单独数据。当然我们接下来就要先复习结构了。
第二个问题,那联合又是什么奇怪的动物呢?欲知究竟,请往下读~
一、结构
我们先来设想一个下面这样的场景,新生入学报道填表,每个新生都要在舍管阿姨那张表里填上自己的学号、姓名、房号、手机号和专业班级。
c语言提供两种聚合数据类型,数组和结构。数组是形状大小完全相同的格子组成,即类型完全相同的元素集合,它的每一个元素都是可以通过下标引用或者指针间接访问来选择的。结构和数组不同,它存储的每个元素就像新生入学表里每个人的学号和姓名一样是各不相同的数据类型,它的这些值称为成员(mumber),结构里各成员的长度不同所以不能通过下标访问,需要通过它们的名字访问它们。
a.声明一个结构
我们现在来动手声明一个结构:
struct tag { mumber-list } variable-list; //声明结构时,我们必须要列出这个结构包含所有成员的列表,列表包括每个成员的类型和名字
下面是几个栗子?:
struct sample {
int a;
float b;
char c;
} x ;
...
struct sample {
int a;
float b;
char c;
} y[20], *z;
以上声明创建了一个名叫x的变量,一个含有20个元素名叫y的数组变量,一个指向结构变量的指针。我们可以看到上面两结构完全相同,但在c语言里,以上这种情况下面出现这种赋值就是非法的:
z=&x;
为什么?因为在上面的结构声明中虽然两个sample都包含一个名为a的整型,一个名为b的浮点型,一个名为c的字符型,但它在计算机眼里是完全不同的两个结构变量,好比现实生活中的双胞胎一样。那怎样处理上述情况呢?
struct sample {
int a;
float b;
char c
};
struct sample x;
struct sample y[20],*z;
z=&x;//此时该语句合法
b.结构成员的直接访问
我们用点操作符直接访问结构变量的成员,点操作符接受两个操作数。我们再声明一个更复杂的结构:
struct complex{
int a[20];
long *p;
struct sample sa[10];
struct sample s;
struct sample *sp;
}com;
现在我们看下面几个栗子?:
表达 | 解释 |
---|
com.a[1] | com结构中成员数组a中的第二个元素 |
(com.sa)[3] | com结构中名为sa的结构数组成员中第四个元素 |
com.s.a | com结构中名为s结构成员中的a成员 |
(com.sa)[4].b | com结构中名为sa结构数组成员的第五个元素结构中的b浮点数 |
c.结构成员的间接访问
说到间接访问第一个就要想到指针,我们还是看上面的com栗子。我们令:
(*sp).b=3.14;
则如何用外部指针间接访问结构中的成员呢?c语言为我们提供了一个更为方便的操作符)—— “箭头操作符(->)”。如何使用呢?
p->b;//即可,注意箭头操作符的优先级非常高
下面我们来做一个有意思的改动?:
sp->a=0;
把a赋值为0,所以(*sp).a的值与sp->a的有值相同都为零。现在我们来玩一个有意思的魔法,好了一起来,准备好你们的魔法棒,变!
*sp->a,这里的间接访问符作用与a存储内容代表的指针值,而a本身的内容为0,即为null空指针,所以它不会指向任何东西。对一个null指针进行解引操作是个错误,但正如我们昨天讨论的一样,有些环境运行时,机器根本不会捕捉到这个错误。
二、联合
打好所有基础才不怕数据结构这个大龙哦~加油!加油!继续努力?!
a.声明一个联合
联合和结构类似,但行为方式和结构不同。联合中所有成员引用的是内存中相同的位置。先让我们看一个简单的例子。
union {
float f;
int i;
}fi;
在一个int和float都为32位的机子上,变量fi只占32位,如果变量中的浮点型被引用,这个字就做为浮点型访问,当然也可以通过其他形式打印出来,比如下面这个操作:
fi.f=3.14;
printf("%d\n",fi.i);
把圆周率的浮点表示存储于fi,然后把这些相同的位当作整形值打印输出。
b.联合的初始化
联合变量可以被初始化,这个初始化变量必须是联合第一个成员的类型,而且必须位于花括号内。 举例?:
union {
int f;
float i;
char a[10];
} x = { 5 };
即把x.f初始化为5.
今天就到这里,关于位段、结构的存储分配、作为函数的参数的结构等内容,循序渐进,在之后的数据结构里马上会出现~以上,明天见!(昨天愣是没过审,生气,再发亿遍!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)