资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,全国计算机等级考试 2C课程,第十一讲 结构体、共用体和用户定义类型,11/6/2024,1,结构体的概念,与数组相比,结构体是一种功能更为强大的构造类型数据。结构体类型可以把不同类型的数据组合成一个整体。,定义方法:,struct 结构体名,数据类型1 成员名1;,数据类型2 成员名2;,数据类型n 成员名n;,;,说明:,struct,是定义结构体类型的关键字;,结构体名、成员名是合法的用户标识符,结构体名可省略(无名结构体),数据类型,n,成员名,n,可以是基本类型也可以是其他构造类型;,同一结构体中成员名不可同名;,结构定义语句的分号不可省略;,结构体类型定义只是规定了该结构体类型的组成形式,编译程序并不会给结构体类型分配存储空间。,11/6/2024,2,结构体类型和结构体变量的定义,应先定义,结构体类型,,再定义,结构体变量,如:,struct,student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,struct,student,stu1,stu2;,又如:,#define,STUDENT,struct student,STUDENT,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,STUDENT,stu1,stu2;,stu1,100102 WangLi F 20 98 Beijing,100101 LiXin M 19 90.5 Shanghai,stu2,11/6/2024,3,结构体类型和结构体变量的定义,也可以直接定义,结构体变量。,一般形式:,struct,类型标识符 成员名;,类型标识符 成员名;,变量名表列;,如:struct,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,本例中,结构体类型没有被命名,这称为无名结构体。无名结构体可以用来直接定义变量,但本类型只能使用一次,后面无法再用。,11/6/2024,4,结构指针变量的定义,结构指针变量说明的一般形式为:,struct 结构名*结构指针变量名,例如,在前面的例题中定义了stu这个结构,如要说明一个指向stu的指针变量pstu,可写为:struct stu*pstu;,当然也可在定义stu结构时同时说明pstu。,结构指针变量也必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量。,要特别注意的是,不能把结构类型名赋予一个指针变量。如果boy是被说明为stu类型的结构变量,则:,pstu=&boy 是正确的;,pstu=&stu 是错误的。,11/6/2024,5,结构体类型和结构体变量的定义,说明,结构体的成员名可以与程序中的变量名相同,二者不代表同一对象。,需要特别说明的是,结构体类型与结构体变量不是一个概念,结构体类型,是用户自定义的结构型数据类型,它在定义时并不需要分配内存。你不能给一种结构体类型赋值,当然也不能对它存取和运算。,结构体变量,就是具有特定结构体类型的变量,编译时系统将为其分配相应的存储空间。可以对其赋值、存取以及运算。,11/6/2024,6,结构体类型和结构体变量的定义,例:,struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,;,注意:这是结构体定义,只描述结构的组织形式,student是结构体类型名,编译时并不为它分配内存,name,num,sex,age,score,addr,4,字节,4,字节,20,字节,1,字节,4,字节,30,字节,结构体只有在实例化时才为每个结构体成员分配内存。,11/6/2024,7,结构体类型和结构体变量的定义,结构体中的成员(即“域”),可以是普通变量也可以是一个结构体变量。也就是说结构体可以嵌套使用。,如:struct date,int month;,int day;,int year;,;,struct student,int num;,char name20;,struct date birthday,;,stu;,num,name,birthday,month,day,year,或:struct student,int num;,char name20;,struct date,int month;,int day;,int year;,birthday;,stu;,11/6/2024,8,结构体变量的初始化,形式一:,struct 结构体名,类型标识符 成员名;,类型标识符 成员名;,.,;,struct 结构体名 结构体变量=初始数据;,例:,struct student,int num;,char name20;,char sex;,int age;,char addr30;,;,struct student stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,11/6/2024,9,结构体变量的初始化,形式二:,struct 结构体名,类型标识符 成员名;,类型标识符 成员名;,.,结构体变量=初始数据;,例 struct student,int num;,char name20;,char sex;,int age;,char addr30;,stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,11/6/2024,10,int i;,变量、数组一旦定义,其存储长度在整个程序中是固定不变的,因此被称为“静态存储分配”。,char name20;,int day;,释放内存空间函数free,struct student,union data,p=q;,char name20;,类型标识符 成员名;,类型标识符 成员名;,float f;,/*以上语句是错误的*/,float f;,struct AB s;,char ch;,结构体变量的初始化,形式三:,struct,类型标识符 成员名;,类型标识符 成员名;,.,结构体变量=初始数据;,例:struct,int num;,char name20;,char sex;,int age;,char addr30;,stu1=112,“Wang Lin”,M,19,“200 Beijing Road”;,11/6/2024,11,结构体变量的引用,在定义了结构体变量以后,当然可以引用这个变量。,引用规则:,结构体中的成员只能单独使用,它的作用与地位相当于普通变量。,引用方式有三种:,指针变量名-成员,(*指针变量名).成员,其中成员(分量)运算符“.”,结构指向运算符“-”,与前面已经接触过的下标运算符、圆括号运算符()的优先级均为 1,结合性从左向右,11/6/2024,12,结构体变量的引用,使用成员(分量)运算符“.”引用结构体成员,如:struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,stu1.score=85.5;,stu1.num=10;,stu1.score+=stu2.score;,stu1.age+;,11/6/2024,13,结构体变量的引用,使用结构指针变量,往往能更方便地访问结构变量的各个成员,其访问的一般形式为:,(*结构指针变量).成员名,或为:,结构指针变量-成员名,例如,:,(*pstu).num,或者:pstu-num,应该注意,(*pstu)两侧的括号不可少,因为成员符“.”的优先级高于“*”。如去掉括号写作*pstu.num则等效于*(pstu.num),这样,意义就完全不对了。,11/6/2024,14,结构体变量的引用,示例:结构指针变量的具体说明和使用方法,struct stu,int num;,char*name;,char sex;,float score;,boy1=102,Zhang ping,M,78.5,*pstu;,main(),pstu=,printf(Number=%dnName=%sn,boy1.num,boy1.name);,printf(Sex=%cnScore=%fnn,boy1.sex,boy1.score);,printf(Number=%dnName=%sn,(*pstu).num,(*pstu).name);,printf(Sex=%cnScore=%fnn,(*pstu).sex,(*pstu).score);,printf(Number=%dnName=%sn,pstu-num,pstu-name);,printf(Sex=%cnScore=%fnn,pstu-sex,pstu-score);,11/6/2024,15,结构体变量的引用,例中,,printf,语句试图整体引用结构体变量,stu1,的用法是不可行的。,举例:,struct student,int num;,char name20;char sex;,int age;,float score;,char addr30;,stu1,stu2;,printf(“%d,%s,%c,%d,%f,%sn”,stu1,);,说明:,(,1,)不能将一个结构体变量作为一个整体进行输入和输出。,11/6/2024,16,结构体变量的引用,说明:,(2)但是,将一个结构体变量赋值给另一个结构体变量是允许的,如:struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,stu1=stu2;,11/6/2024,17,结构体变量的引用,说明:,(3)对于嵌套的结构体,内部成员可以逐级引用,例:struct student,int num;,char name20;,struct date,int month;,int day;,int year;,birthday;,stu1,stu2;,stu1.birthday.month=12;,11/6/2024,18,结构体变量的引用,说明:,(4)不能对结构体变量做关系运算,例:struct student,int num;,char name20;,char sex;,int age;,float score;,char addr30;,stu1,stu2;,if(stu1=stu2),例中,语句if(stu1=stu2)是错误的,11/6/2024,19,函数之间结构体变量的数据传递,函数之间结构体变量的数据传递分以下几种情况,(1)向函数传递结构体变量的成员,(2)向函数传递结构体变量,(3)向函数传递结构体的指针,例如:通过函数给结构体成员赋值,#include stdio.h,struct AB,char a10;,int b;,;,getdata(struct AB*p),scanf(%s%d,main(),struct AB s;,getdata(,printf(%s,%dn,s.a,s.b);,11/6/2024,20,动态存储分配,动态存储分配的概念,变量、数组一旦定义,其存储长度在整个程序中是固定不变的,因此被称为“静态存储分配”。然而,实际编程中,有时候所需的内存空间取决于实际输入的数据,无法预先确定。,为了解决上述问题,语言提供了一些内存管理函数,可以按需要动态地分配内存空间,也可把不再使用的空间回收(释放),这种机制称为“动态存储分配”。,常用的动态存储分配函数有以下三个:,
展开阅读全文