结构体的通俗讲解1(结构体的声明,访问)
结构体声明
emmmm 一般我们可以看到
struct(Structure type)后面跟上它的成员,所有可选成员数量大于等于2个(一个的话使用int,char类型的变量,数组什么的就足以完成功能)
代码1没有提供变量列表,没有创建任何变量,可以在结构体下一条加上struct student stu1的方式创建变量。
代码2则是提供变量列表并创建stu1变量
//代码1 struct student { long num; float score; struct student *next; }; //代码2 struct student { long num; float score; struct student *next; }stu1; //代码3 typedef struct student { long num; float score; struct student *next; }STUDENT; STUDENT stu11;
成员可以使用数组,变量,指针(也算变量,单独拎出来)。以上述代码为例, student是标签(tag),struct student就是自定义的一个类型说明符(和c语言中的 int , float一样),和成员列表联系起来了(类似int和整型的联系)。
我们可以使用typedef(typedef是用来为复杂的声明定义简单的别名)创建一个新的类型,如代码3,和代码1代码2结构标签的效果是一样的,但是这个时候STUDENT现在是一个类型名了,而不是结构标签,所以可以后续
STUDENT *Time;
这样更加省事地创建变量,而不用费力地写
struct student *Time;
提高代码简洁性。当然我们可以把代码3用更简洁地方式写出来,这也是后面链表,树,栈的常用写法,这里的struct student和STUDENT可以看做等价,struct student* 和STDENT*可以看做等价,其中Time是指向该结构体的指针。
typedef struct student { long num; float score; struct student *next; }STUDENT,*Time;
这里有一个问题,既然可以视作等价的,为什么上述代码不能写如下2种(创建失败,系统报错)
typedef struct student { long num; float score; STUDENT *next; }STUDENT,*Time;
///
typedef struct student { long num; float score; Time next; }STUDENT,*Time;
原因就是自引用的顺序问题,STUDENT,Time是直到声明的末尾才定义的,在结构声明的内部尚未定义。
结构体的成员与访问
结构体的成员可以包括其他所有数据类型(所有在结构体外部声明的变量都可以放到结构体里面),于此同时,在结构体内部的成员名字可以与外部的一样,在内部命名 float score ,在结构外面也可以有 float score ,这不会产生冲突。
以开头的代码为例子,这个里面的成员访问包括间接访问和直接访问,直接访问是利用点操作符(.)来进行的,是自左向右结合的,代码如下
struct student { long num; float score; struct student *next; }stu1;
想要访问num,使用 stu1.num就可以选择了结构体中的num。
同时点操作符也是可以嵌套的,访问结构体中的结构体的元素(结构体里可以放结构体),例如(xxx.xx).xx 这种形式