6、自定义数据类型
6.1 结构体
为什么用结构体
在一个组合项中包含若干个类型不同(或相同)的数据项。
形式:
struct 结构体类型名
{成员表};
每一个成员也称为结构体中的一个域(field),成员表又称为域表。
结构体的定义及其初始化
定义方法:
(1)先声明结构体类型再定义变量
struct Student{
.....
};
Student student1,student2;
(2)在声明类型的同时定义变量
struct Student{
.....
}student1,student2;
初始化:
(1)在定义时指定初始值
struct Student{
.....
}student1={...};
(2)声明类型和定义变量分开
struct Student{
.....
};
Student student1={...};
引用结构体变量
形式
结构体变量名.成员名
“.”是成员运算符,优先级最高
结构体数组
每一个数组元素都是一个结构体类型的数据
指向结构体变量的指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址
1、通过指向结构体变量的指针引用结构体变量中的成员
Student stu;
Student *p=&stu;
结构体变量名.成员名 = (*p).成员名 = p->成员名
2、用结构体变量和指向结构体变量的指针构成链表 (链表详见6.3)
链表中的每一个元素称为“结点”,每个结点都包括两个部分:用户需要的实际数据,下一个结点的地址。
最后一个元素不再指向其他元素,它的地址部分放一个“NULL”
结构体类型数据作为函数参数
(1)用结构体变量名做参数
(2)用指向结构体变量的指针作实参,将结构体变量的地址传给形参
(3)用结构体变量的引用作函数形参,它就成为实参的别名
6.2 动态内存分配
用new和delete运算符进行动态分配和撤销存储空间
new和delete是运算符,不是函数,因此执行率高。
new 类型 [初值]
new int;//存放整数的空间,返回一个指向该存储空间的地址(指针)
new int(100);//存放整数的空间,指定该整数初值为100,返回一个指向该存储空间的地址(指针)
new char[10];//存放字符数组(包括10个元素)的空间,返回首元素地址
new int[5][4];//存放二维数组的空间,返回首元素地址
用new分配数组时不能指定初值
float *p = new float(3.14);//将返回的该空间的地址赋给指针变量p
delete 指针变量(对变量)
delete [ ] 指针变量(对数组)
完整例子
int main(){
Student *p;
p = new Student;
p->name = "wang";
p->num = 10123;
cout<<p->name<<endl<<p->num<<endl;
delete p;
return 0;
}
6.3 链表与链表的基本操作
链表中的每一个元素称为“结点”,每个结点都包括两个部分:用户需要的实际数据,下一个结点的地址。
最后一个元素不再指向其他元素,它的地址部分放一个“NULL”
静态链表:所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放。各结点既可以通过上一个结点的next访问,也可以直接通过结构体变量名a,b,c访问。
动态链表:各结点是可以随时插入和删除的,这些结点并没有变量名,只能先找到上一个结点,才能找到下一个结点。只有提供头指针head的地址,才能访问整个列表。
包括静态链表的建立
动态链表的建立、插入、删除等
详见《C++程序设计题解与上机指导(第3版)》P109
6.4 枚举类型
一个变量只能有几种可能的值。
形式:
enum 枚举类型名{枚举常量表}
花括号内的内容称为枚举元素/枚举常量
声明后可用来定义变量
enum weekday{sun,mon,tue,wed,thu,fri,sat};
weelday workday,week_end;
workday=mon;
week_end=sun;
也可以在声明枚举类型的同时定义枚举变量
enum {sun,mon,tue,wed,thu,fri,sat}workday,week_end;
枚举元素作为常量,是有值的,编译系统按定义时的顺序赋值整数0,1,2…
cout<<workday;
打印为 1
也可以在声明枚举类型时自己指定枚举元素的值
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};
后续元素按顺序+1,sat为6
PS:不能把一个整数直接赋给一个枚举变量,只接受枚举变量类型的数据
workday = tue;
正确
workday = 2;
错误
workday = weekday(2);
先进行强制类型转换,此时正确