大一的时候学习c++,结构体一章老师并没有多讲,只是寥寥几句就带过了,自己后来也没有去看,可是在学习数据结构的过程中代码经常出现struct,让我很头晕,每次不是睁一只眼闭一只眼就是草草翻几页书,以致问题始终得不到很好的解决,今天就静下心来从头开始了解一下结构体这种自定义数据类型。
结构体的出现是因为某些信息的逻辑关系要求多种数据类型组合在一起工作,由于数组起不到这一作用(数组元素类型都相同),所以c++为此提供了结构体这一机制。总的来说,结构体专门用于描述类型不同,但逻辑意义相关的数据所构成的聚集。
废话说了一堆,接下来是放点干货的时候了。
........................................................
结构体的成员既可以是c++的基本数据类型(如整型,浮点型,字符型等),也可以是复杂的数据类型(如数组,指针以及其他结构体)。
定义结构体类型的几种形式举例:
(1)
struct Student{ //定义Student结构体
int num;
char name[20];
char gender;
float score;
}; //注意!本行的分号不能省略。
Student stud3,stud4; //声明Student结构体的变量
(2) 也可以把声明的变量放在结构体的尾部
struct Student{
int num;
char name[20];
char gender;
float score;
}stud3,stud4;(3)也可以定义无名结构体类型
struct { //定义无名结构体类型
int num;
char name[20];
char gender;
float score;
}stud3,stud4; //stud3和stud4是该结构体变量
*需要注意的是,系统不会为结构体类型分配内存空间,只有在定义结构体变量时才会导致内存的实际分配,所谓为结构体变量分配内存空间,实际上就是为该变量的每个成员单独分配空间。
嵌套结构体
还记得我们开头说的,结构体的成员不仅可以是普通数据类型,还可以是结构体吗?下面我们通过一例来说明:
struct Date{ //定义结构体类型Date
int year;
int month;
int day;
};
struct { //定义无名结构体类型
int num;
char name[20];
char gender;
Date birthday; // 结构体变量birthday又作为其它结构体类型的成员,及嵌套结构体
float score;
}stud3,stud4;
结构体变量的初始化:
在声明结构体变量的同时可以对变量进行初始化。其方法类似于数组的初始化,初始值表按照结构体成员声明的顺序给出各成员的初始值,各初始值之间用逗号分隔,如下:
Student stud5={102,"Liu Dehua",'M',92};
如果初始值的数目少于成员数目,剩余成员将被自动初始化为0;
结构体变量成员的引用方法:
(1)在使用结构体变量时,可以把它作为一个整体来使用,如:
stud1=stud2;
这样就可以把stud2的值赋给stud1,实际上就是将stud2各成员值赋给stud1的对应成员。当然除了整体赋值外,也可以通过对各成员的单独赋值来实现。
(2)访问结构体变量的成员时,可以使用圆点运算符“.”或箭头运算符“->”,如:
stud1.num=5;
stud2->gender='F';
stud3.birthday.day=12;
结构体指针:
(1)结构体指针声明的一般形式为:
Student *pStud,stud; //定义了一个结构体指针pStud和一个结构体变量stud;
pStud=&stud; //将结构体变量stud的地址赋值给pStud,指针pStud就指向了stud;
(2)通过指针访问它所指向的结构体变量的成员:
pStud->num=5;
或
(*pStud).num=5; //括号不可省略