2.8.1 结构体的定义
结构体能够将不同的数据类型的变量或者数组封装在一起,以存储自定义的数据结构,方便存储一些符合结构
struct Name{
//一些基本的数据结构或者自定义的数据类型
};
例如,需要存储一个学生的学号、性别、姓名和专业,就可以这样定义
struct studentInfo{
int id;
char gender;//'F'or'M'
char name[20];
char major[20];
}Alice,Bob,stu[1000];
studentInfo
结构体的类型名
内部定义的是单个学生的具体信息
大括号外部定义了studentInfo
类型的Alice
和Bob
两个结构体变量;
之后的stu[1000]
就是当有很多学生时定义的一个结构体数组(如果不在此处定义变量或者数组,则大括号外直接跟上分号)
结构体变量和结构体数组除了可以像上面直接定义外,也可以按照基本数据类型(如int
型)那样定义:
studentInfo Alice
studentInfo stu[1000];
需要注意的是,结构体里面能定义自己本身(这样会引起循环定义的问题)之外德任何数据类型。不过虽然不能定义自己本身的,但是可以定义自身类型的指针变量。例如:
struct node{
node n;//不能定义node型变量
node* next;//可以定义node*型的指针变量
};
2.8.2 访问结构体内的元素
结构体如下:
struct studentInfo{
int id;
char name[20];
studentInfo* next;
}stu,*p;
访问stu中变量的写法如下:
stu.id
stu.name
stu.next
而访问指针变量p中的元素的写法如下:
(*p).id
(*p).name
(*p).next
由于对结构体指针的访问比较复杂,因此有一种稍微简便一点的写法:
p->id
p->name
p->next
2.8.3 结构体的初始化
一般的初始化方法:
stu.id=1;
stu.getId='M';
或者在读入的时候进行赋值:
scanf("%d %c",&stu.id,&stu.gender);
但是这很不方便,所以可以使用构造函数。所谓的构造函数就是用来初始化结构体的一种函数,他直接定义在结构体之中。构造函数的一个特点就是它不需要写返回值类型,而且函数名和结构体的名字完全相同。
一般来说,对一个普通定义的结构体,其内部生成默认的构造函数(但是不可见),如下:
struct studentInfo{
int id;
char gender;
//默认生成的构造函数如下
studentInfo(){}
};
上面的构造函数的参数和函数体显然是空的,那么可以再其中添加东西手动进行构造函数的初始化,如下:
struct studentInfo{
int id;
char gender;
//下面的参数用以对结构体的内部变量进行赋值
studentInfo(int _id,char _gender){
//赋值
id=_id;
gender=_gender;
}
};
当然,构造函数也可以简化成一行:
struct studentInfo{
int id;
char gender;
studentInfo(int _id,char _gender):id(_id),gender(_gender){}
};
这样就可以在需要的时候对构造函数进行赋值
studentInfo stu = studentInfo(10086,'M');
注意:如果自己定义了构造函数,就不能不经过初始化就定义结构体变量,也就是说,默认生成的构造函数studentInfo(){}
此时被覆盖了。为了既能够不初始化就定义结构体变量,又能享受初始化带来的便捷,可以吧studentInfo(){}
手动加上。这意味着,只要参数个数和类型不完全相同,就可以定义任意多个构造函数,以适应不同的初始化场合,示例如下:
struct studentInfo{
int id;
char gender;
//用以不初始化就定义结构体变量
studentInfo(){}
//只初始化gender
studentInfo(char _gender){
gender=_gender;
}
//同时初始化id和gender
studentInfo(int _id,char _gender){
id=_id;
gender=_gender;
}
};
下面是一个应用实例,其中结构体Point用于存放平面点的坐标x、y
#include<stdio.h>
struct Point{
int x,y;
Point(){}//用以不经过初始化的定义pt[10]
Point(int _x,int _y):x(_x),y(_y){}//用以提供x和y的初始化
}pt[10];
int main(){
int num=0;
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
pt[num++]=Point(i,j);//直接使用构造函数
}
}
for(int i=0;i<num;i++){
printf("%d,%d\n",pt[i].x,pt[i].y);
}
return 0;
}