1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 自定义数据类型——结构体

自定义数据类型——结构体

时间:2020-06-09 17:58:11

相关推荐

自定义数据类型——结构体

结构体的定义与使用

数组是一种数据形式,其特点是多个相同类型的元素集合起来

结构体是另一种重要的数据形式,特点是将不同类型的成员组合起来

数组和结构体形成了两种风格迥异的聚合方式,通过他们以及相互组合,嵌套的机制可以构造出复杂的,满足应用要求的自定义数据类型

定义结构体类型

结构体允许将不同类型的数据元素组合到一起形成一种新的数据类型,其声明形式为:

struct 结构类型名 {成员列表};

例如可以通过如下声明建立表示学生信息的数据类型

struct STUDENT {//学生信息类型int ID; //声明一个整型成员表示学号char name[25]; //声明一个字符串数据成员表示名字char sex; //声明一个字符数据成员表示性别int age; //声明一个整型数据成员表示年龄double score; //声明一个浮点型数据成员表示成绩}

1.结构体类型声明

结构体类型声明一般放在程序文件开头,此时这个声明是全局的。

在全局作用域内,该声明处处可见,因此同作用域内的所有函数都可以使用它。

结构体类型声明也可以放到函数内部,此时这个声明是局部的。

说明:

(1)结构体类型和普通数据类型一样(如int,char,double等)一样是类型名称,而不是该类型的一个实体,因此不会为结构体类型分配存储空间

(2)结构体类型声明成员时成员可以又是结构体类型

2.结构体类型实例化

定义结构体对象称为结构体类型实例化,实例化会根据数据类型为结构体对象分配内存单元

定义结构体对象有两种形式:

(1)先声明结构体类型再定义对象

结构体类型名 结构体对象名列表STUDENT a,b; //定义结构体对象

(2)声明结构体类型的同时定义对象

一般形式:结构体类型名 {成员列表}结构体对象名列表;

DATE {//日期类型int year,month,day; //年,月,日,整型}d1,d2; //定义结构体对象

3.结构体对象的内存形式

实例化结构体对象后,对象会得到存储空间可以在结构体对象定义时进行初始化

struct STAFF {//职员信息类型int ID; //工号,整型char name[25]; //姓名,字符串char sex; //性别,字符型DATE birthday; //出生日期,结构体类型double salary; //薪水,浮点型};

STAFF s1 = {1001,"Li Ming","M",{1980,10,6},2700.0};

4.结构体对象成员引用

使用结构体对象主要是引用它的成员,其中一般形式为:结构体对象名.成员名

STAFF a,b;a.ID = 1002; //将1002赋值给a对象中的ID成员b.salary = a.salary + 500.0; //在表达式中引用对象成员a.ID++; //按优先级等于(a.ID)++

(1)如果成员本身又是一个结构体对象,就要用成员引用运算符,一级一级地引用。例如:

STAFF x;x.birthday.year = 1990; //逐级引用成员

(2)不能将一个结构体对象作为整体进行输入或者输出,只能对结构体对象成员逐个进行输入或输出,例如:

STAFF x;cin>>x.ID>>x.sex>>x.salary;cin>>x.name;

(3)结构体对象可以进行赋值运算,但不能进行算术运算,关系运算等,例如:

COMPLEX m,n,k;m = n; //正确,结构体对象允许赋值k = m+n; //错误,结构体对象不能做算术运算m > n; //错误,结构体对象不能做关系运算

结构体与数组,指针,函数

1.结构体与数组

数组元素可以是结构体类型,称为结构体数组,如一维结构体数组定义形式为:

sturct 结构体类型名 结构体数组名[常量表达式];

struct POINT {//点类型int x,y; //平面上点的x,y坐标};POINT points[100]; //表示100个点的数据对象

一维结构体数组初始化形式为:

struct 结构体类型名 结构体数组名[常量表达式】 = {初值序列};

其中初值序列必须按内存形式做到类型,次序一一对应。

struct RECT {//矩形框类型int left,top,right,bottom;};RECT rect[2] = {{1,1,10,10},{5,5,25,32}};

引用结构体数组成员需要将下标运算,对象成员引用运算结合起来操作,其一般形式为:

数组对象[下标表达式].成员名

结构体类型中包含数组成员,数组成员类型既可以是基本数据类型,又可以是指针类型,或者结构体类型。

例如表示平面三角形的数据对象,可以这样定义:

struct TRIANGLE {//三角形类型POINT p[3]; //由三个平面上的点描述三角形};

TRIANGLE tri;tri.p[0].x=10,tri.p[0].y=10;//结构体对象.数组成员[下标表达式].成员名

2.结构体与指针

结构体对象名成员的地址:&对象名.成员名

例如:

STAFF m; //结构体对象int *p1; //指向ID成员的指针类型是int*char *s1,*s2; //指向name,sex成员的指针类型是char*DATE *p2; //指向birthday成员的指针类型是DATE*p1 = &m.ID; //取ID成员的地址s1 = m.name; //name的成员是字符数组,数组名即是地址s2 = &m.sex; //取sex成员的地址p2 = &m.birthday; //取birthday成员的地址

结构体对象的地址:&对象名

例如:

struct STAFF m,*p; //指向结构体对象的指针p = &m; //取结构体对象的地址

注:显然,结构体对象的地址值(&m)与第一个成员的地址值(&m.ID)相同

假设p是指向结构体对象的指针,通过p引用结构体对象成员有两种方式:

(1)对象法:(*p).成员名

(2)指针法: p->成员名

两种方式中,更常用第二种方式,->为指针成员引用运算符

p->ID=1002; //将1002赋值给对象中的ID成员,指针成员引用运算结果是左值(即成员本身)p->salary = p->salary+500.0; //在表达式中引用指针指向的成员p->ID++; //按优先级等价于(p->ID)++

如果成员本身又是一个结构体对象指针,就要用指针引用运算符一级一级的引用成员。

例如:

DATA d = {1981,1,1};TEACHER {//教师信息类型int ID; //工号char name[25]; //姓名DATE *pbirthday; //出生日期}a={1001,"Li Min",&d},*p=&a;

p->ID = 1001; //通过指针p引用a的ID成员p->pbirthday->year = ; //通过指针p->pbirthday引用d的year成员

3.结构体与函数

将结构体对象作为函数实参传递到函数中,采用值传递方式

例如:

struct DATA {int data;char name[15];};void fun1(DATA x); //函数原型void fun2() {DATA a={1,"LiMin"};fun1(a);//函数调用}

将结构体数组作为函数参数,采用地址传递方式,函数调用实参是数组名,形参必须是同类型的结构体数组。

例如:

void fun3(DATA x[]); //函数原型void fun4() {DATA A[3]={1,"LiMin",2,"MaGang",3,"ZhangKun"};fun3(A); //函数调用}

采用地址传递方式,形参数组的首地址与实参数组完全相同

将结构体指针作为函数参数,采用地址传递方式

例如:

void fun5(DATA *p); //函数原型void fun6() {DATA a={1,"LiMin"};fun5(&a); //函数调用}

函数的返回类型可以是结构体原型,这时函数将返回一个结构体对象

例如:

DATA fun8() {DATA a={1,"LiMin"};return a; //返回结构体对象,复制到临时对象中}void fun9() {DATA b;b = fun8(); //函数返回结构体对象,并且赋值}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。