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