2.8 结构体的使用

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类型的AliceBob两个结构体变量;
之后的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; 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值