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

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

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

1、C 语言程序设计,林小茶 Email: ,第7章 指针,7.1 指针类型与指针运算符 7.2 空间的动态分配与指针运算 7.3 指针与函数 7.4 指针与一维数组 7.5 二级指针 7.6 指针数组 7.7 指针与二维数组 7.8 命令行参数,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,定义格式: 指针所指对象的数据类型 *指针变量名1,*指针变量名2,;,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,取地址,取内容,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符

2、,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,例7.1指针作为scanf函数的参数。 #include “stdio.h“ void main() int score; /*定义整型变量score*/ int *p= /*输出score*/ ,指针变量,指针p取地址,7.1 指针类型与指针运算符,7.1 指针类型与指针运算符,7.2 空间的动态分配与指针运算,7.2.1 问题提出和程序示例,定义数组时,程序员必须对数组的长 度有一个正确的估计,否则就可能造成大 量空间的的浪费。 C语言提供了动态分配空间,很好地 解决了这个问题。 例7.2 编写程序首先询问用户学生的 人数,然后

3、读入这些学生的成绩到一组动 态分配的空间中,最后输出这组成绩。,#include “stdio.h“ #include “stdlib.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表

4、示空指针。 空指针是一个特殊的值,C语言为指针类型的变量专门定义一个空值,将空值赋值给一个指针变量以后,说明该指针变量的值不再是不定值,是一个有效的值,但是并不指向任何变量。 空指针写作NULL,数值为0。,7.2 空间的动态分配与指针运算,7.2.3 存储器申请,从程序员的角度: 申请与释放空间 对于系统: 分配与回收空间 存储器申请与释放的函数均在stdlib.h文件中定义。,7.2 空间的动态分配与指针运算,7.2.3 存储器申请,malloc函数用于申请空间。 对函数malloc的调用方式是: (指针所指对象的数据类型 *) malloc(sizeof(指针所指对象的数据类型)*个数)

5、 功能:从内存中申请一块指定字节大小的连续空间,返回该存储块的首地址作为函数的结果。如果申请空间失败,说明没有足够的空间可供分配,返回空指针NULL。,7.2 空间的动态分配与指针运算,7.2.3 存储器申请,int *pi; pi=(int *)malloc(sizeof(int); int *pj; pj=(int *)malloc(sizeof(int)*10);,申请一个动态的整型存储单元,申请十个动态的整型存储单元,(1) 函数malloc必须说明为 “void *malloc();” 或在程序中加入“#include “stdlib.h“”。,(2) 在申请空间时,应该检测mall

6、oc函数是否成功分配。方法是判断该函数的返回值。 常用的方法是: if (p=(int*)malloc(sizeof(int)*size)=NULL) ,7.2.3 存储器申请,(3) 指针必须指向已经分配好了的空间才有意义。 程序段一: void main () char *p; *p=a; /*错误*/ 程序段二: char *p,c; p=,7.2 空间的动态分配与指针运算,7.2.4 存储器释放,free的调用方式是: free(指针变量名) 功能:释放以指针变量名所指的位置开始 的存储块,以分配时的存储块为基准。,(1) free与malloc必须配对使用,使用malloc申请的空间

7、必须用free释放。,(2) 语句“free(p);”不改变p的内容。 该语句执行以后,就不能用任何的指针再访问这个存储区。例如,p和q指向同一地址,语句“free(p);”执行以后,q所指的空间也将不能再使用,因为这部分空间已经被系统回收了。,7.2.4 存储器释放,表达式p+n(n=0)指向的是p所指的数据存储单元之后的第n个数据存储单元。这里的数据存储单元不是内存单元,内存单元的大小是固定的,而数据存储单元的大小与数据类型有关。,7.2.5 指针值的算术运算,p,p+2,p+1,1.在指针值上加减一个整数,如果整型占4个字节,地址按字节编址,p是 指向整型的指针,p的值是9000,则p+

8、1=9004, p+2=9008,p+n=9000+4*n。,7.2.5 指针值的算术运算,char *pc; short int *pi; float *pf; 如果sizeof(char)的值是1,sizeof(short int) 的值是2, sizeof(float) 的值是4,假设三个指针的开始值均为9000。 p+1的值是? pi+1的值是? pf+1是值是?,7.2.5 指针值的算术运算,p=p+n 表示什么? n可以是负数吗?含义是? p+ 表示什么? 使p指向下一个空间,p的内容要发生变化,这是最常用的指针操作。,7.2.5 指针值的算术运算,使用关系运算符、=、=和!=可以

9、比较指针值的大小。 如果p和q 是指向相同的类型的指针变量,并且p和q指向同一段连续的存储空间,p的地址值小于q的值,则表达式pq的结果为1,否则,表达式pq的结果为0。,2. 指针值的比较,7.2.5 指针值的算术运算,2. 指针值的比较,7.2.5 指针值的算术运算,3. 指针减法,7.2.5 指针值的算术运算,如果p和q定义为指针,则表达式p-q的结果是p是q后面的第几个数据单元。,p-q的值是?,例7.3 编写程序使用动态分配的空间读入9个字符,使用指针操作方法,寻找?出现的位置(第几个字符)。 #include “stdio.h“ #include “stdlib.h“ #defin

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

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

12、o.h“ #include “stdlib.h“ #define ERROR printf(“out of memoryn“);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

13、)+*(q-2); /*产生Fibonacci数列每个值*/ for (i=1,q=p;qp+size;q+,i+) /*循环size次*/ printf(“%10d“,*q); /*输出内容*/ if (i%5=0) printf(“n“); /*换行,每行输出5个*/ free(p); /*释放空间 */ ,例7.6编写程序先申请9个存储单元读入9个整数,再申请20个存储单元,将前面读入的9个数正序放入新申请的存储单元的前9个存储单元,然后再将这9个数逆序放入前9个存储单元的后面。 #include “stdio.h“ #include “stdlib.h“ #include “proce

14、ss.h“ void main() int i,size=9; int *x; /*定义指针*/ int *aux,*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*/ free(x); /* 释放原来的9个存储单元*/ x=aux; /* 输出18个数*/ for (i=0;isize;i+) printf(“%d “,*(x+i); ,7.3 参数传递,例7.7编写函数真正交换两个数。 #include “stdio.h“ void swap(int *x,int *y) /*形式参数为指针类型*/ int temp; temp=*x; /*指针所指的内容交换*

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

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

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