C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8

上传人:E**** 文档编号:89422965 上传时间:2019-05-25 格式:PPT 页数:82 大小:444KB
返回 下载 相关 举报
C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8_第1页
第1页 / 共82页
C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8_第2页
第2页 / 共82页
C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8_第3页
第3页 / 共82页
C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8_第4页
第4页 / 共82页
C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8_第5页
第5页 / 共82页
点击查看更多>>
资源描述

《C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版) 教学课件 ppt 作者 林小茶 C_ch8(82页珍藏版)》请在金锄头文库上搜索。

1、C 语言程序设计,林小茶 Email: ,第8章 指针,8.1 空间的动态分配与指针运算 8.2 指针与函数 8.3 指针与一维数组 8.4 二级指针 8.5 指针数组 8.6 指针与二维数组 8.7 命令行参数,8.1 空间的动态分配与指针运算,8.1.1 问题提出和程序示例,定义数组时,程序员必须对数组的长 度有一个正确的估计,否则就可能造成大 量空间的的浪费。 C语言提供了动态分配空间,很好地 解决了这个问题。 例8.1 编写程序首先询问用户学生的 人数,然后读入这些学生的成绩到一组动 态分配的空间中,最后输出这组成绩。,#include “stdio.h“ #include “stdl

2、ib.h“ #define ERROR printf(“out of memoryn“);return; void main() int size; int *p,*aux; printf(“Please let me know how many students in your class:“); scanf(“%d“, ,指针变量的定义,申请size个整型空间,指针运算,释放空间,NULL是空指针,8.1 空间的动态分配与指针运算,8.1.2 空指针,NULL表示空指针。 空指针是一个特殊的值,C语言为指针类型的变量专门定义一个空值,将空值赋值给一个指针变量以后,说明该指针变量的值不再是不

3、定值,是一个有效的值,但是并不指向任何变量。 空指针写作NULL,数值为0。,8.1 空间的动态分配与指针运算,8.1.3 存储器申请,从程序员的角度: 申请与释放空间 对于系统: 分配与回收空间 存储器申请与释放的函数均在stdlib.h文件中定义。,8.1 空间的动态分配与指针运算,8.1.3 存储器申请,malloc函数用于申请空间。 对函数malloc的调用方式是: (指针所指对象的数据类型 *) malloc(sizeof(指针所指对象的数据类型)*个数) 功能:从内存中申请一块指定字节大小的连续空间,返回该存储块的首地址作为函数的结果。如果申请空间失败,说明没有足够的空间可供分配,

4、返回空指针NULL。,8.1 空间的动态分配与指针运算,8.1.3 存储器申请,int *pi; pi=(int *)malloc(sizeof(int); int *pj; pj=(int *)malloc(sizeof(int)*10);,申请一个动态的整型存储单元,申请十个动态的整型存储单元,(1) 函数malloc必须说明为 “void *malloc();” 或在程序中加入“#include “stdlib.h“”。,(2) 在申请空间时,应该检测malloc函数是否成功分配。方法是判断该函数的返回值。 常用的方法是: if (p=(int*)malloc(sizeof(int)*s

5、ize)=NULL) ,8.1.3 存储器申请,(3) 指针必须指向已经分配好了的空间才有意义。 程序段一: void main () char *p; *p=a; /*错误*/ 程序段二: char *p,c; p=,8.1 空间的动态分配与指针运算,8.1.4 存储器释放,free的调用方式是: free(指针变量名) 功能:释放以指针变量名所指的位置开始 的存储块,以分配时的存储块为基准。,(1) free与malloc必须配对使用,使用malloc申请的空间必须用free释放。,(2) 语句“free(p);”不改变p的内容。 该语句执行以后,就不能用任何的指针再访问这个存储区。例如,

6、p和q指向同一地址,语句“free(p);”执行以后,q所指的空间也将不能再使用,因为这部分空间已经被系统回收了。,8.1.4 存储器释放,表达式p+n(n=0)指向的是p所指的数据存储单元之后的第n个数据存储单元。这里的数据存储单元不是内存单元,内存单元的大小是固定的,而数据存储单元的大小与数据类型有关。,8.1.5 指针值的算术运算,p,p+2,p+1,1.在指针值上加减一个整数,如果整型占4个字节,地址按字节编址,p是 指向整型的指针,p的值是9000,则p+1=9004, p+2=9008,p+n=9000+4*n。,8.1.5 指针值的算术运算,char *pc; short int

7、 *pi; float *pf; 如果sizeof(char)的值是1,sizeof(short int) 的值是2, sizeof(float) 的值是4,假设三个指针的开始值均为9000。 p+1的值是? pi+1的值是? pf+1是值是?,8.1.5 指针值的算术运算,p=p+n 表示什么? n可以是负数吗?含义是? p+ 表示什么? 使p指向下一个空间,p的内容要发生变化,这是最常用的指针操作。,8.1.5 指针值的算术运算,使用关系运算符、=、=和!=可以比较指针值的大小。 如果p和q 是指向相同的类型的指针变量,并且p和q指向同一段连续的存储空间,p的地址值小于q的值,则表达式pq

8、的结果为1,否则,表达式pq的结果为0。,2. 指针值的比较,8.1.5 指针值的算术运算,2. 指针值的比较,8.1.5 指针值的算术运算,3. 指针减法,8.1.5 指针值的算术运算,如果p和q定义为指针,则表达式p-q的结果是p是q后面的第几个数据单元。,p-q的值是?,例8.2 编写程序使用动态分配的空间读入9个字符,使用指针操作方法,寻找?出现的位置(第几个字符)。 #include “stdio.h“ #include “stdlib.h“ #define ERROR printf(“out of memoryn“);return; #define size 9 void main

9、() char *p,*q; /*定义两个指针*/ p=(char *)malloc(size); /*申请第一个存储块 */ if (p=NULL) /*申请失败则退出*/ ERROR printf(“Please enter %d char:“,size); for (q=p;qp+size;q+) /*输入9个字符到刚分配的空间中*/ *q=getchar(); for (q=p;*q!=? ,例8.3编写程序输入一个十进制的正整数,将其对应的八进制数输出。 #include “stdio.h“ #include “stdlib.h“ #define LIMIT 9 #define ER

10、ROR printf(“out of memoryn“);return; void main() long x; char *p,*aux; /*定义两个指针*/ printf(“Please enter one int:“); scanf(“%ld“, /*释放空间 */ ,例8.4用动态分配空间和指针操作方法解决Fibonacci数列问题,求出Fibonacci数列的前n项存储在动态分配的空间中,然后输出Fibonacci数列的前n项。n由用户指定。 #include “stdio.h“ #include “stdlib.h“ #define ERROR printf(“out of me

11、moryn“);return; void main() int size,i,*p,*q; /*定义变量*/ printf(“Please enter length of memory you need:“); scanf(“%d“, /*申请一个存储块 */ if (p=NULL) /*申请失败则退出*/ ERROR,*p=1; *(p+1)=1; /*设置Fibonacci数列的前两项*/ for (q=p+2;qp+size;q+) /*循环size-2次*/ *q=*(q-1)+*(q-2); /*产生Fibonacci数列每个值*/ for (i=1,q=p;qp+size;q+,i

12、+) /*循环size次*/ printf(“%10d“,*q); /*输出内容*/ if (i%5=0) printf(“n“); /*换行,每行输出5个*/ free(p); /*释放空间 */ ,例8.5编写程序先申请9个存储单元读入9个整数,再申请20个存储单元,将前面读入的9个数正序放入新申请的存储单元的前9个存储单元,然后再将这9个数逆序放入前9个存储单元的后面。 #include “stdio.h“ #include “stdlib.h“ #include “process.h“ void main() int i,size=9; int *x; /*定义指针*/ int *au

13、x,*point1,*point2; /*定义指针*/ x=(int*)malloc(9*sizeof (int); /*申请9个整型存储单元*/ if (x=NULL) exit(1); /*申请9个整型存储单元*/ printf(“nPlease enter 9 integer:“); for (point1=x;point1x+size;point1+) /*读入9个整型数*/ scanf(“%d“,point1);,for (i=0;i=x) /* 将9个数逆序存入前面9个数的后面*/ *point2=*point1; point2+; point1-; size+=9; /*长度加9

14、*/ free(x); /* 释放原来的9个存储单元*/ x=aux; /* 输出18个数*/ for (i=0;isize;i+) printf(“%d “,*(x+i); ,8.2 指针与函数,8.2.1 返回指针值的函数,返回的指针指向单元的类型 * 函数名(参数表),返回的指针指向单元的类型 * 函数名(参数表);,指针变量=函数名(实参);,例8.5编写程序先申请9个存储单元读入9个整数,再申请20个存储单元,将前面读入的9个数正序放入新申请的存储单元的前9个存储单元,然后再将这9个数逆序放入前9个存储单元的后面。 例8.6修改例8.5将该程序模块化。 #include “stdio

15、.h“ #include “stdlib.h“ #include “process.h“ int *init(int size) /*返回指针值的函数*/ return (int *)malloc(size*sizeof(int); /*申请空间将首地址返回*/ void readin(int *x,int size) int *point; printf(“nPlease enter 9 integer:“); for (point=x;pointx+size;point+) /*读入size个整型数*/ scanf(“%d“,point); ,void writeout(int *x,int si

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号