高级语言程序设计教学课件第8章.ppt

上传人:王** 文档编号:506628 上传时间:2023-11-13 格式:PPT 页数:69 大小:4.43MB
下载 相关 举报
高级语言程序设计教学课件第8章.ppt_第1页
第1页 / 共69页
高级语言程序设计教学课件第8章.ppt_第2页
第2页 / 共69页
高级语言程序设计教学课件第8章.ppt_第3页
第3页 / 共69页
高级语言程序设计教学课件第8章.ppt_第4页
第4页 / 共69页
高级语言程序设计教学课件第8章.ppt_第5页
第5页 / 共69页
高级语言程序设计教学课件第8章.ppt_第6页
第6页 / 共69页
高级语言程序设计教学课件第8章.ppt_第7页
第7页 / 共69页
高级语言程序设计教学课件第8章.ppt_第8页
第8页 / 共69页
高级语言程序设计教学课件第8章.ppt_第9页
第9页 / 共69页
高级语言程序设计教学课件第8章.ppt_第10页
第10页 / 共69页
亲,该文档总共69页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《高级语言程序设计教学课件第8章.ppt》由会员分享,可在线阅读,更多相关《高级语言程序设计教学课件第8章.ppt(69页珍藏版)》请在优知文库上搜索。

1、n理解内存单元的双重属性理解内存单元的双重属性300130023006300330053007n变量与地址变量与地址内存中每个字节有一个编号内存中每个字节有一个编号地址地址 名称名称类型类型地址地址值值xint3000随机随机pint*3004随机随机n直接访问与间接访问直接访问与间接访问 直接访问直接访问:按变量地址存取变量值:按变量地址存取变量值 间接访问间接访问:通过存放变量地址的变量去访问变量:通过存放变量地址的变量去访问变量300130023006300330053007名称名称类型类型地址地址iint3000pint*3004n直接访问是用简单变量来访问内存单元的直接访问是用简单变

2、量来访问内存单元的地址地址n间接访问是通过存放简单变量地址(指针)间接访问是通过存放简单变量地址(指针)的变量去访问内存单元的地址的变量去访问内存单元的地址300130023006300330053007-9-n指针的主要应用:指针的主要应用:指针作形参可以在指针作形参可以在的值的值 利用指针作形参可以使子利用指针作形参可以使子 利用指针可以实现利用指针可以实现 利用指针可以实现利用指针可以实现(链表、队列、(链表、队列、堆栈、树等)的操作堆栈、树等)的操作 指针可以指针可以单向值传递单向值传递单向单向值传递值传递 形参是变量,实参可以是常量、变量或表达式。形参是变量,实参可以是常量、变量或表

3、达式。形参与实参占用不同的内存单元。形参与实参占用不同的内存单元。单向值传递单向值传递(形参的改变并不影响实参)。(形参的改变并不影响实参)。地址传递地址传递 形式参数为指针变量,实际参数为变量的地址。形式参数为指针变量,实际参数为变量的地址。形参指向实参。形参指向实参。地址传递地址传递13ff7613ff7813ff7a13ff7c3 5&a=13ff7c,&b=13ff78调用前:调用前:a=3,b=5-swap-x=13ff7c,y=13ff78-swap-调用后:调用后:a=5,b=313ff8213ff8413ff8613fe88n在该例题中,我们利用指针作形参实现了在该例题中,我们

4、利用指针作形参实现了修改实参变量修改实参变量的值。的值。n指针变量的说明指针变量的说明指针运算符指针运算符&取变量或存储单元的地址取变量或存储单元的地址 *取指针所指向的单元(变量)取指针所指向的单元(变量)结论:结论:*ptpt相当于相当于a a (*pt)+pt)+相当于相当于a+a+&*pt=&a=ptpt=&a=pt *&a=&a=*pt=a pt=a&aapt *pta=1;a=1;n指针变量的初始化指针变量的初始化 一般形式一般形式 -22-xpx&x8运行结果为:运行结果为:16 1616 16)04()04()04(242,2422242,2422222221212221acb

5、acbacbiabacabxiabacabxabxxaacbabxaacbabx if(flag 0)printf(Two real solutions:x1=%f,x2=%fn,t1+t2,t1-t2);else if(flag=0)printf(One solution:x1=x2=%fn,t1);else printf(Two complex solutions:x1=%f+%fi,x2=%f-%fin,t1,t2,t1,t2);int solvroot(float a,float b,float c,float*r1,float*r2)float delta;*r1=-b/(2*a);

6、delta=b*b-4*a*c;if(delta=0)*r2=sqrt(delta)/(2*a);else *r2=sqrt(-delta)/(2*a);return(int)delta;n在该例题中,我们利用指针作形参实现了在该例题中,我们利用指针作形参实现了子函数有三个的返回值。子函数通过返回子函数有三个的返回值。子函数通过返回值返回值返回(int)delta的值,通过形参的值,通过形参*r1、*r2与实参与实参&t1、&t2结合返回另外结合返回另外两个值两个值n函数定义形式:函数定义形式:例例 int*f(int *x,int*y)#include void main()int a,b,

7、*p;scanf(%d%d,&a,&b);p=printf(较大的数是较大的数是%dn,*p);if(*x*y)return x;elsereturn y;一、指向数组元素的指针一、指向数组元素的指针 数组元素是内存的一个单元,故数组元素是内存的一个单元,故指向数组元素的指针变量的性质指向数组元素的指针变量的性质和指向变量的指针变量是一样的和指向变量的指针变量是一样的 例如:例如:int a10,*p;也可以在定义时对指针赋初值:也可以在定义时对指针赋初值:int a10,二、通过指针引用数组元素二、通过指针引用数组元素n指针的运算指针的运算 指针变量的赋值运算指针变量的赋值运算p=&a;p=

8、array;p=&arrayi;p1=p;int i,a,*p,*p1;int array10;指针的算术运算指针的算术运算p i 表示的表示的p向前或向后移动向前或向后移动i个元素个元素(i为整型数为整型数)p+,p-,p+=i,p-=i等等若若p1与与p2指向同一数组,指向同一数组,p1-p2=两指针间元素个数两指针间元素个数p1+p2无意义无意义a0a1a2a3a4a5a6a7a8a9a数组数组 指针的关系运算指针的关系运算若若p1和和p2指向同一数组,则指向同一数组,则l p1p2 表示表示p1指的元素在后指的元素在后l p1=p2 表示表示p1与与p2指向同一元素指向同一元素若若p1

9、与与p2不指向同一数组,比较无意义不指向同一数组,比较无意义a0a1a2a3a4a5a6a7a8a9a数组数组nint a10,*p=a;则我们要使用数组中第则我们要使用数组中第i个元素,可以用如下的个元素,可以用如下的方法表示:方法表示:-36-ai*(a+i)pi*(p+i)数组元素表示法数组元素表示法数组元素地址表示法数组元素地址表示法&ai a+i&pi p+i下标法下标法main()int a10;i;for(i=0;i10;i+)scanf(%d,&ai);for(i=0;i10;i+)printf(%d,ai);数组名计算地址法数组名计算地址法main()int a10;i;fo

10、r(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(%d,*(a+i);例例:输入输出整型数组:输入输出整型数组a a的全部元素。的全部元素。(假有假有1010个元素个元素)指针法指针法main()int a10,i,*p;p=&a0;for(i=0;i10;i+)scanf(%d,p+i);for(i=0;i10;i+)printf(%d,*(p+i);-38-39-main()int i,*p,a10;p=a;for(i=0;i10;i+)scanf(%d,p);p+;for(i=0;i10;i+)printf(%d,*(p+i);p pp p

11、p pp pp pp pp pp pp pp pp p p p 1.1.数组名是数组的首地址,数组名是数组的首地址,p=&a0p=&a0与与p=ap=a等价等价。2.2.指针变量可以使本身的值改变,数组名不可以。指针变量可以使本身的值改变,数组名不可以。p+p+正确正确 a+a+不正确不正确 3 3指针变量可以指到数组后的内存单元。指针变量可以指到数组后的内存单元。4 4要注意指针变量的当前值。要注意指针变量的当前值。指针变量的复杂运算指针变量的复杂运算void main()/*冒泡冒泡*/int n=10,a10=3,2,4,5,6,8,9,25,21,10;int i,j,temp;int

12、*p 与与 int a10 p 是指针是指针数组名数组名a 是指针(地址)是指针(地址)若若p=a,则,则p+i是是ai的地址的地址(即即p+i=&ai)数组元素的表示方法数组元素的表示方法:和和,即即:若若p=a,则则 系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一般一般);而给);而给a分配分配4*10字节的内存区字节的内存区,即即:q作为形参时:作为形参时:int a34;把把理解成理解成由由#include void main()int a22=1,2,3,4;int i;45 for(i=0;i2;i+)printf(a+%d=%x,i,a+i);pr

13、intf(t*(a+%d)=%x,i,*(a+i);printf(t a%d=%x,i,ai);printf(t*(*(a+%d)=%dn,i,*(*(a+i);for(i=0;i2;i+)printf(a0+%d=%x,i,a0+i);printf(t*(a0+%d)=%dn,i,*(a0+i);a+0=13ff70 *(a+0)=13ff70 a0=13ff70 *(*(a+0)=1a+1=13ff78 *(a+1)=13ff78 a1=13ff78 *(*(a+1)=3a0+0=13ff70*(a0+0)=1a0+1=13ff74*(a0+1)=2n对于二维数组对于二维数组a22,指针常

14、量,指针常量a和和a0是不是不同类型的指针。通过运行结果我们可以看到:同类型的指针。通过运行结果我们可以看到:指向二维数组的第指向二维数组的第0行;行;指向二维数组第指向二维数组第0行第行第0个元素个元素47*(a+0)和和*(a+1)*(*(a+0)和和*(*(a+1)*(a0+0)和和*(a0+1)a0+2指向谁呢?指向谁呢?a11有多少表示法呢?有多少表示法呢?*(a0+3)、*(a1+1)*(*(a+1)+1)int a22;例例:求二维数组求二维数组a34所有元素的和以及平均值。所有元素的和以及平均值。main()int a34=1,2,3,4,5,6,7,8,9,10,11,12;

15、int i,sum=0,*p;p=&a00;for(i=0;i12;i+,p+)sum=sum+*p;printf(“sum=%d,aver=%f”,sum,sum/12.0)数列的中位数是数列中按照数值数列的中位数是数列中按照数值大小排在中间位置的数。例如:数列大小排在中间位置的数。例如:数列1,2,3,4,5的中位数为的中位数为3。n算法算法:先对数列排序,然后寻找排序序列的先对数列排序,然后寻找排序序列的中位数。中位数。49#include void main()int ser100;int i,num;printf(Input length of serial:n);scanf(%d,

16、&num);printf(input serial elements:n);for(i=0;inum;i+)scanf(%d,ser+i);printf(The median of serial is%dn,*(ser+num/2);void sort(int a,int n)int i,temp;int*p;for(i=0;in-1;i+)for(p=a;p*(p+1)temp=*p;*p=*(p+1);*(p+1)=temp;51Input length of serial:5input serial elements:1-3 23 67 15The median of serial is 23#include#define M 3#define N 2int maxarray(int aMN,int m,int n,int*pmaxi,int*pmaxj);void main()int aMN=1,2,3,4,5,6;int max,maxi,maxj;printf(“a%d%d=%d”,max,maxi,maxj);int i,j,max=a00;for(i=0;im;i+)f

展开阅读全文
相关资源
猜你喜欢
相关搜索

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

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!