《快速学会数据结构中的指针和结构体.ppt》由会员分享,可在线阅读,更多相关《快速学会数据结构中的指针和结构体.ppt(35页珍藏版)》请在三一办公上搜索。
1、,指针,指针的定义声明一个指针变量给指针赋值指针的运算,自定义数据类型,基本数据类型数据类型 结构类型,基本数据类型有哪些?如何使用?,问题一:学籍管理,问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用C语言程序存储并处理一组学生的学籍。,单个学生学籍的数据结构学号(num):int型 姓名(name):char 型 性别(sex):char型 年龄(age):int型 分数(score):float型,单个学生学籍的数据结构如何定义?,多个学生学籍的数据结构如何定义?,解决办法,定义一个结构体类型当已有的类型满足不了需要时,C语言规定可以由用户自定义数据类型。stru
2、ct studentint num;char name10;char sex;int age;float score;,另一个例子,定义一个结构体类型日期类型struct dateint month;int day;int year;,定义一个结构体类型,语法:struct 结构体名称 成员列表;定义一个时间类型Time,成员有时、分、秒。,结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;.;struct 结构体名 变量名表列;,例 struct student int num;char name20;char se
3、x;int age;float score;char addr30;struct student stu1,stu2;,说明结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算;变量:可以结构体的成员可以是一个结构变量结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期,诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点:每个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。不同的人,数据的值不同,但都有共同的成员组成。,为将不同数据类型、但相互关联的一
4、组数据,组合成一个有机整体使用,C语言提供一种称为“结构”的数据类型。,结构体 也是构造类数据,但其成员可以是任何类型的。,构造类型使用户可以象处理单个变量一样来处理复杂的数据结构。,要在程序中使用结构必须:声明结构类型结构类型的声明描述该结构的成员名称和它们的数据类型。定义结构变量结构变量的定义是根据结构类型为所定义变量分配存储空间。,9.3 结构体变量的引用引用规则 结构体变量不能整体引用,只能引用变量成员,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用(只能对最低级的成员进行赋值或存取以及运算),成员(分量)运算符优先级:1结合性:从左向右,引用方式:结构体变量名.成员名
5、,结构体变量的初始化形式一:,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”;,struct 结构体名 类型标识符 成员名;;,/*struct 结构体名 合称“结构类型标识符”*/,/*成员表列*/,/*此处分号不能省略*/,小结:什么是“结构体类型”?,用户自己定义的构造型数据
6、类型;由若干数据项(成员)组成;同一结构体中的成员可以具有不同的数据类型;结构体类型变量占用的内存长度等于各成员项长度之和。,使用结构体的一般步骤,根据问题的要求定义一个结构体类型用自己定义的结构体类型定义结构体变量在程序中使用结构体变量处理问题注意成员定义与普通变量定义的区别:成员定义时不为其分配内存 变量定义时为其分配内存,main()struct student int number;char name6;char sex;int age;char address20;printf(%dn,sizeof(struct student);,结果:31,main()struct char n
7、ame15;char class12;long num;stu=Wenli,Computer 1,200113;printf(%sn%sn%ldn,stu.name,stu.class,stu.num);,结果:Wenli Computer 1 200113,用结构体数组管理一组学生的信息,前面单个学生可用结构体变量std1,std2处理若是一个班级的学生呢?,解决办法:一组学生的数据,可以使用结构体数组进行处理。假定数组名为std,则定义student数组,可以使用下面的说明语句:struct student std10;或者在定义结构体类型的同时定义结构体数组,9.5 结构体数组,9.5.
8、1定义结构体数组:每个数组元素都是一个结构体类型的数据,它们都分别包括各个成员项,定义结构体后定义struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu3;,定义结构体时同时定义struct student int num;char name20;char sex;int age;float score;char addr30;stu3;,9.5.2 结构体数组的初始化 结构数组n初值表1,初值表2,.,初值表n;,一般初始化省略维数 定义后初始化,一般初始化s
9、truct student int num;char name20;char sex;int age;float score;stu3=10101,李宁,M,18,87.5,10102,张凡,M,19,99,10103,王敏,F,20,78.5;,定义后初始化struct student int num;char name20;char sex;int age;float score;;struct student stu3=10101,李宁,M,18,87.5,10102,张凡,M,19,99,10103,王敏,F,20,78.5;,每个数组元素的初始数据都用花括号括起来。,例 2统计侯选人
10、选票。有三个候选人,每次输入一个得票的候选人名,要求最后输出个人得票结果。,struct person char name20;int count;leader3=“Li”,0,“Zhang”,0,”Wang“,0;main()int i,j;char leader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.coun
11、t);,9.6 用指针访问结构体,9.6.1 指向结构体变量的指针定义形式:struct 结构体名*结构体指针名;例:struct student*p;使用形式:使用结构体指针变量引用成员形式(*结构体指针名).成员名 结构体指针名-成员名 结构体变量名.成员名,成员运算符.指向运算符-优先级:最高结合方向:从左向右(*)与-等价,示例9,main()struct student long int num;char name20;char sex;float score;stu,*p;/定义结构体变量stu和结构体指针变量p p=,9.2 指向结构体数组的指针,struct student i
12、nt num;char name20;char sex;int age;stu3=10101,Li Lin,M,18,10102,Zhang Fun,M,19,10104,Wang Min,F,20;main()struct student*p;for(p=stu;pnum,p-name,p-sex,p-age);,9.9类型定义(typedef),除可直接使用提供的标准类型和自定义的类型(结构、共用、枚举)外,也可使用typedef定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。,给已有的数据类型加一个新的别名提高程序可读性(但未建立新的数据类型)。一般形式:typedef
13、 数据类型名 新别名(已有定义)(习惯用大写)例 typedef float REAL;REAL a,b,c;,typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。,用 法,1、简单数据类型 typedef float REAL;REAL a,b;=float a,b;2、数组 typedef char STR80;STR s1;=char s180;3、指针 typedef float*PF;PF p;=float*p;4、函数 typedef char FCH();FCH a;=cha
14、r a();,用 法,5、结构体typedef struct int year,month,day DATE;DATE birthday;相当于 struct int year,month,day birthday;,几个常用函数,malloc函数realloc函数free函数#include 有些编译器需要#include。,malloc 向系统申请分配指定size个字节的内存空间。返回类型是 void*类型。void*表示未确定类型的指针。C,C+规定,void*类型可以强制转换为任何其它类型的指针。例子:int*p;p=(int*)malloc(sizeof(int);例子:int*p=(int*)malloc(sizeof(int)*100);,realloc 重新向系统申请分配指定newsize个字节的内存空间。返回类型是 void*类型。例子:char*p;p=(char*)malloc(100);p=(char*)realloc(p,256);,释放内存空间函数free 调用形式:free(void*ptr);功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。,