《C/C程序设计》第06章(复合数据类型).ppt
《《C/C程序设计》第06章(复合数据类型).ppt》由会员分享,可在线阅读,更多相关《《C/C程序设计》第06章(复合数据类型).ppt(63页珍藏版)》请在三一文库上搜索。
1、第六章 复合数据类型,6.1 指针类型 概念: 旅馆房间、房间编号、房间名称、派房牌(上写房间号)。 1)地址 给内存单元(一般是字节)的编号 。计算机根据它找到对应的字节进行访问(存取)。 高级语言中定义一个变量,编译时根据其类型分配相应数目的字节(如int 型分2个字节,float 分4个字节),将变量名与对应内存字节映射。 变量名 地址 内存单元 2)指针 给变量、数组、结构体、函数等分配的内存单元或块区的首地址。 假如有:long m=56000 则 : &m 就是 m的指针或者说是 m所占内存单元的首地址。此例中,56000就放在从这个地址开始的连续四个字节中。 3)指针变量 定义一
2、种特殊变量,这种变量专门存放指针,用它也可找到(指向)变量、数组、结构体、函数,这样的变量 称作指针变量。 按变量是直接寻址;按指针变量是间接寻址。 由于变量、数组、结构体、函数等所分配的内存单元或块区的大小及结构不同,指针变量因而也要定义成相应的类型,不能混用。,例 交换两数。 void swap( ); main( ) int a, b; scanf(%d%d”, ,2000H,2001H,2EA0H,2EA1H,a=10,b=8,内存,地址,变量,10,8,指针变量,p2=&b=2EA0H,:,:,:,3100H,3101H,3802H,3803H,2000H,2EA0H,p1=&a=2
3、000H,变量的指针变量 1) 指针变量的定义 * ; 例 int *p1, *p2; 2) 指针变量的赋值 指针变量=,其中:* 号是取值运算符。 * 与 定义时的 * 与使用时的 * 含义不同,前者表示定义的是指针变量;后者是对变量的取值运算。 定义了一个某类型的指针变量后,它可以指向任意一个同类型变量。 4)指针变量作函数参数 主调函数 被调函数 实参 形参 &a p p p,6.2 数组类型 数组的特点: (1) 数组中的每一个元素均属于同一类型,我们称这种类型为数组的基类型; (2) 每个数组中的元素个数一经确定后就保持不变,我们称它为数组的长度; (3) 数组中的每个元素均为变量,
4、我们用数组下标来直接访问数组的元素; (4) 数组中的元素还允许是数组类型,从而产生二维数组、多维数组等结构; (5) 在数组定义中,常量表达式的值虽然指出了数组元素的个数,但C编译器不做越界检查; (6) 数组名表示数组所用空间的首地址,也就是数组第0个元素的地址。是一个常量地址。 一、一维数组的声明 格式:类型 数组名常量表达式; 二、一维数组的引用与初始化,引用形式: 数组名下标 初始化形式:存储类别 数据类型 数组名数组长度=初始化值; 例: static int a5=10,20,30,40,50; 一般要求:只有定义为静态或外部存储的才能初始化。 三、数组作为函数的参数(传递地址)
5、 例:对一字符串反序输出。(exinver.c) 四、二维数组的声明 形式: 类型 数组名常量表达式常量表达式; 如:int scores503; 说明:编译程序为二维数组分配存储空间时是按行进行的,即先按顺序存放第一行的所有数据,然后接着按顺序存放第二行的所有数据,如此类推。二维数组scores的存储空间分配如下图所示:, . 25000 scores00 25002 scores01 25004 scores02 25006 scores10 25008 scores11 25010 scores12 . . . . 25298 scores492 .,五、二维数组元素的引用与初始化 引用
6、形式: 数组名行下标列下标 /下标为整数类型的表达式 如:scores201=100; 初始化形式:存储类别 数据类型 数组名常量1常量2=初值; 如:static int s34=50,60,80,20,40,90,70,100,10; 例 矩阵行列互换。Exmatrix.c 1 2 3 4 1 5 9 5 6 7 8 2 6 10 9 10 11 12 3 7 11 4 8 12 六、指针与数组 在语言中,指针与数组之间的关系是十分密切的。指针类型变量可以当作数组使用,数组类型变量也可以当作指针使用,即在语,言中,我们可以象访问指针一样访问数组,也可以象访问数组一样访问指针。其区别为:数组
7、名不能自加、自减,但指针变量可以。 例如:int a10,*p; p=a; p+或p-都是成立的,而a+ 或a-是不成立的。 而 *(a+I)、aI、*(p+I)、pI是等价的。 七、指针数组与数组指针 指针数组:指基类型为指针类型的数组,即该数组的每个元素均为一个指针。如果我们需要保留许多指针的值,也就是要保存多个变量的地址,就可以使用指针数组。 定义形式:数据类型 *数组名数组长度; 如: int *p10; /在此声明了一个包含10个整数类型指针变量的数组p。这里“*“并不是数组名字的组成部分,它只是告诉编译程序p是一个整数类型的指针数组,而不是简单的整数类型数组。,例:建立如下距阵并输
8、出 1 0 0 0 1 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 1 0 0 0 1 程序为: main() int a55=0,*p5,i,j; for(i=0;i5;i+) pi= ,数组指针:,定义形式:数据类型 (*指针变量名)长度; 如:int (*array_ptr)10;/申明了一个指针类型的变量array_ptr,它指向一个长度为10 的整数数组。 数组指针可以看成是二维的,此时与二维数组在存储上相同,但变量名是指针变量,可以进行指针运算。 引用方式: 若有:int (*p)4,a34; p=a; 引用: *(*(p+I)+j) aIj 例:exarrp.c,
9、6.3字符串,一、字符串常量与变量:字符串变量是一个基类型为字符类型的数组变量,同样遵循“先声明、后使用”的原则,我们在声明字符串变量时,可用字符串常量作初始化。如:char name10=“limeixue”; 初始化方式有三种。 也可以定义指针变量指向字符串。如:char *name=“limeixue”; 二、字符串数组 定义:char * name12; 例:按姓名查询。Exsearch.c,三、字符串库函数(string.h) 1. char * strcat(char *str1, const char *str2); 作用: 将字符串str2连接到字符串str1后,形成一个新字符
10、串,原先str1的结束标记0被取消。函数返回值为str1。注意为字符串变量str1分配的存储空间一定要足够大,能够容纳两个字符串连接后的新字符串。 如:char s1=“good ”,s2=“evening!”; strcat(s1,s2); 2. char * strchr(const char *str, int ch); 作用: 寻找字符串str中第一次出现字符ch的位置。如果找到ch,则返回指向该位置的指针;否则返回空指针。 3. int strcmp(const char *str1, const char *str2); 作用: 比较字符串str1和str2的内容是否相同。如果st
11、r1小于str2则返回负数;如果str1等于str2则返回零;如果str1大于str2则返回正数。 4. char * strcpy(char *str1, const char *str2); 作用:将str2指向的字符串复制到str1指向的位置中并返回str1。注意为str1分配的存储空间必须能放得下str2指向的字符串。 注:char *str; strcpy(str,“Be careful”); 引起的问题。,5. unsigned int strlen(const char *str); 作用:返回字符串str中的字符个数,包括其中的空格与转义字符,但不包括字符串结束标记0。 6.
12、char *strstr(const *str1, const char *str2); 作用:寻找字符串str2在字符串str1中第一次出现的位置,不包括str2的结束标记0。如果找到str2,则返回指向该位置的指针;否则返回空指针。 四、字符串应用 例1: 按姓名排序。(exnsort.c) 冒泡法排序(从小到大):n个数参与排序,每趟找出最大数存与最后,共n-1趟。每一趟中对相邻的两个元素进行比较,不符合次序的立即交换。 例2:打印出全班每个学生姓名的长度。Exlen.c,6.4 结构体类型 一、概述,记录型数据与结构体 一组相关的不同数据类型的数据项,可作一个整体来处理。PASCAL中
13、称“记录型”数据,C中称结构体类型数据。与数组有明显不同,数组要求其所有成员的类型、长短一样结构体类型和结构体变量。,struct student int num; char name20; char sex; struct date birthday; float score; stu1, stu2;,struct date int month; int day; int year; ;,什么情形时适用结构体或数组?,二、定义结构体的类型和变量,定义结构体类型 一般形式: 例 参见上页,struct 结构体类型名 分量1; 分量2; 分量3; : 分量: 分量又称域或成员。 当分量是结构体时
14、,形成定义时的嵌套。,定义结构体类型的变量,定义结构体变量 三种形式:,1. 定义结构体的同时定义 例如前页例。 2. 先定义结构体,后定义结构体变量 例:struct stu . ; . struct stu st1,st2; 3. 直接定义 例:struct . 变量名表; 在struct 后不出现结构体类型名,三、 结构体变量的引用,结构体类型不是存储数据的实体,即系统并不是给它分配内存,它仅是一种数据类型,与int, char 类似,用来定义一种数据类型的变量; 结构体类型变量才是存储数据的实体,结构体变量的分量具体分配存储单元,等价于一组变量。因此我们引用的是结构体变量。 引用结构体
15、变量只能通过引用结构体变量的分量(成员)实现(在I/O时,赋值时等)。用“.”或“-”引用。 例如:sum=st1.score+st2.score; 成员运算符(多级) 例如:age=1999-st1.birthday.year; _QC允许将一结构体变量的所有分量赋予同类的另一变量。 例如:st2=st1; 例 ex2stu1.c,四、 结构体数组,以某结构体类型也可以定义数组 例 按姓名查询。ex2stuarr.c,struct student int num; char name30; char sex; float score; stu30; 每个下标变量stui 都有结构体类型stu
16、dent 的各个分量; 下标变量的引用同变量。,五、 结构体类型的指针,指向结构体类型变量的指针,指向结构体类变量的指针就是该变量所占用的内存区段的首址。 例 struct student int num; char name3; char sex; float score; st1,st2,st3; struct student *p=,num,name,sex,score,:,:,2A00H,st1,p,指向结构体类型数组的指针,指向结构体类数组的指针就是该数组所占用的内存区段的首址。 例 struct student int num; char name3; char sex; floa
17、t score; st30=; struct student *p=st; for(p=st;pnum, p-name,p-sex,p-score);,:,:,2A00H,st0,st1,st2,st3,:,2A0AH,2A14H,2AE0H,p,例:若干个学生的信息包括:学号、姓名、三门可课的成绩(c语言、电子技术、控制理论)、总分,要求打印一份名次表。 分析:总分是需要计算的。 按总分从小到大排序(bubble)。 按行输出。 Ex2table.c,指向结构体类型数据的指针 一、指向结构体类型变量的指针 例 打印通讯录。(excommu.c) 二、指向结构体数组的指针 例用结构指针建立一个
18、图书检索系统。按书名检索。 (exsearch.c) 三、结构指针的使用 例链表。 链表的建立、遍历、查找、插入、删除操作。,2019/2/23,链表,什么是链表?,线性表:有限个元素的有序集合。可用数组或链表表示。 数组和链表两 者都逻辑连续,但后者可以在空间不连续。 动态数据结构:其大小可变;动态分配存储空间。链表是最简单的一种,属于线性动态数据结构,树是非线性动态数据结构。 链表:链表中的一个元素称为一个结点或节点。每个结点由两部分组成:数据部分、指向上下结点的指针。靠这样的指针把各个结点串联起来构成链表。分单向、双向链表,后者可以两方向连接。,0,0,单向链表,双向链表,0,数据部分,
19、2019/2/23,链表,为什么使用链表?,1)不需要连续存储空间,可利用内存碎片; 2)插入删除元素不需移动其它元素,处理速度快; 3)动态分配存储空间,不必以最大可能长度预定存储空间, 且可以随意扩充表的容量。 动态分配存储空间(使用函数) void *malloc(unsigned size)函数(memory allocation):在内存的动态存储区中分配一个长度为size的连续空间,size为结点元素各成员项的总字节数,可以用sizeof(数据类型名)运算符获得。该函数的返回值是一个指针,它的值是所分配存储区的起始地址,当该函数未成功执行时,返回值为0。 如: struct stu
20、dent int num; float score; struct student *next;*p1; p1=(struct student *)malloc(sizeof(struct student);,void free(ptr)函数:该函数释放由ptr指向的内存区。Ptr是最近一次调用calloc或malloc函数时返回的值。 用结构体及结构体指针构造链表和链表操作 (1)建立链表。链表的建立过程可以描述如下: 假设结构体定义如下: struct node int num; float s; struct node *next; ; 1. 为了建立链表,在程序中需要使用两个指向结构的
21、指针。 例如:struct node *p1, *p2; 建立链表时,首先使用malloc函数为第一个元素分配存储 空间,并把该空间的地址赋予p1,使p1指向该存储空间: p1=(struct node *)malloc(sizeof(struct node);,2.把p1的值赋予p2,从而使p2也指向该存储空间,便于连接 后面的结点元素。 3.通过p1访问成员num和s,并对其赋值: p1-num=1; scanf(“%f”,使指针p2指向第二个(始终指向最 后一个)元素。反复执行上面的四个语句,就可以不断地把 元素加入到链表中去。这种建立链表的方法是从表头插入的 过程,指针p2总是指向最后
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC程序设计 程序设计 06 复合 数据类型
链接地址:https://www.31doc.com/p-2152624.html