对于很多非计算机专业来说,c语言课程基本上指针都不怎么讲,更别说后面的结构体了。这造成很多学生对结构体的不熟悉。这里我就浅谈一下我对结构体的认识。
结构体,就是我们自己定义出一种新的类型,定义好之后,使用结构体定义变量就和int,char一样方便。实际上,定义一个结构体就是向内存申请一块空间来存放数据,这一点和数组有点像。但是数组只能存放类型相同的数据,而结构体则不一样,他可以存放不同类型的数据,如int,float,char,数组等。c++的类的感念就和结构体很类似,类就是加强版的结构体。我们常常使用结构体来存储一类数据,比如说一个学生的结构体,我们在里面存储id,name,grade(成员)等信息,目的是更好地处理和管理数据。
结构体的定义:
结构体一般定义在.h的头文件中,定义的形式为:
struct student
{
int id;
char name;
float grade;
};(需要注意的是,在定义的花括号最后需要加分号)
在定义好结构体之后,就可以用他来定义变量了,定义变量的方式如下:
struct student stu1 = {11,"lilei",90.5},stu2 ;这里可以部分初始化,可以全部初始化,也可以不初始化。对于数组类型数据,除了初始化的赋值之外,若在后面需要赋值,则要用strcpy或者scanf的%s方式来整体输入。定义完变量之后,就可以利用变量来调用里面的成员,形式如下:
stu1.id = 15;用.来操作结构体中的数据。
同样的,可以定义结构体的指针,形式如下:
struct student *p_stu = &stu1;指针应用结构体成员可以用箭头的方式,比如p_stu—>id = 18;也可以用成员运算符.的形式,如(*p_stu).id = 16;这三种方式引用结构体成员是完全等效的。这里的p的类型是struct student *,他的步长就是这个结构体所占的空间大小。接下来就引出结构体数组的概念。
结构体数组就是数组中的数据都是一个个的结构体变量,定义的形式如下:struct student stu[10];这样就建立了一个结构体数组,他的空间大小是10*sizeof(struct student ),若此时再用结构体指针指向数组首地址,p_stu = stu,那么就可以用指针来访问数组中的每一个结构体以及其中的成员,可以用下标法,也可以用解引用,两种方法完全等效,形式如下:
p_stu[i] 等同于stu[i]等同于*(p+i)等同于*(a+i)
这四种方式都可以用来引用结构体数组中的每一个结构体,然后在用成员运算符来引用其中的成员。
一般结构体的定义还有以下几种形式:
第一种:struct student
{
int id;
char name;
float grade;
}stu1,stu2;
这种就是在定义结构体的同时定义了两个结构体变量。
第二种:typedef struct student
{
int id;
char name;
float grade;
}s_stu,*p_stu;
这种是用s_stu,*p_stu来替代struct student和struct student*,在定义变量的时候只需要s_stu stu1,p_stu p1就可以定义一个结构体变量和一个结构体指针变量,效果和struct student stu1和struct student *p是一样的效果。
结构体还有一点要了解的就是结构体成员的对齐。结构体对齐就是一般以4,8,12位对齐,这样cpu读取的效率会比较高,当然是否对齐,多少位对齐都是可以人为设定的。
另外,结构体成员在内存空间的存储也都是连续的,在定义变量后,就开辟了一块地址空间来存数数据。而定义结构体则不会占用内存,这也是定义结构体时不能初始化的原因,而且在定义结构体的时候不能嵌套自身的结构体。但是定义结构体的时候可以嵌套别的结构体,形式如下:
typedef struct name
2 {
3 char lname[10];
4 char fname[10];
5 }nam,* p_nam;
6
7 typedef struct student
8 {
9 nam nm;
10 float grade[3];
11 float avr;
12 }s_stu,*p_stu;
引用数据的形式如下:
(p+i)->nm.fname的形式就可以引用结构体中嵌套的结构体成员了。
关于结构体,就先简单说这么多。