樊媛媛《c语言程序设计》10-指针.ppt
《樊媛媛《c语言程序设计》10-指针.ppt》由会员分享,可在线阅读,更多相关《樊媛媛《c语言程序设计》10-指针.ppt(68页珍藏版)》请在三一办公上搜索。
1、第十章 指针 指针:C的一个重要概念、重要特色。它使C具备了强大的功能,使C成为程序设计语言之首。正确而灵活地运用它,就可以方便地处理很多其它高级语言所不能处理的问题。不掌握指针等于没有掌握C语言的精华。,101 指针的概念 简单地说,指针就是地址。要掌握指针的概念就必须弄清:内存地址概念?变量与地址的关系?如何通过地址进行变量的存取?,说明例:内存用户数据 1000 3 i 1002 6 j 1004 9 k对变量值的存取总是按地址进行的-直接访问。,int i,j,k;i=3;j=6;k=i+j;,程序经编译后,变量名就不复存在,以地址对应。,也可以采用“间接访问”方式:先将变量i的地址存
2、放到另一变量p1中,要访问i时,先取出p1的内容(变量i的地址),再去访问该地址所对应的内存单元中的内容(变量i的值)。,内存用户数据 1000 3 i 1002 6 j 1004 9 k 2000 1000 p1 2004 1002 p2,int i,j,k;i=3;j=6;k=i+j;int*p1,*p2;p1=,在以上概念的基础上对指针下定义:变量的地址就是该变量的指针。存放地址的变量称指针变量。若p1存放了变量i的地址,则称p1是指向变量i的指针变量。,int i,j,k;i=3;j=6;k=i+j;int*p1,*p2;p1=,102 变量的指针和指向变量的指针变量 变量的指针 指针
3、变量 指向变量的指针变量 用“*”代表“指向”如*p1代表它所指向的变量i,同一内存单元。以下两个语句等价:i=3;直接访问*p1=3;间接访问int i,*p1;p1=,内存用户数据 1000 3 i 1002 6 j 1004 9 k 2002 1000 p1 2004 1002 p2,int i,j,k;i=3;j=6;k=i+j;int*p1,*p2;p1=,5,8,指针变量的定义 指针变量也必须先定义后使用。int*p1;注意:*表示该变量为指针变量,但变量名是p1。一个指针变量只能指向同一类型的变量。int i,*p1;float a;p1=不合法,指针变量的引用 两种用法:用地址
4、运算符 不允许 使用指针运算符*之前,p1必须被赋值(即p1必须存放了某个变量的地址),例:T10-1.c 注意:要区别定义和引用中的“*”main()int a=100,b=10;int*p1,*p2;定义指针变量,尚无体指向 p1=,运算结果:*p1=100,*p2=10&a=12ff7c,&b=12ff78p1=12ff7c,p2=12ff78&p1=12ff74,&p2=12ff70,要特别注意以下用法的后果:egp1.c int*p1;*p1=100;,例:输入a和b两个整数,按先大后小的顺序输出 main()T10-2.c int a,b,*p1,*p2,*p;scanf(“%d,
5、%d”,2004 p2 2006 p 改变p1和p2的指向,1000,1002,1002,1000,1000,重要概念:只要将某一变量的地址存入指针变量中,就可通过指针变量间接访问该变量。配钥匙!,swap(int p1,int p2)int t;t=p1;p1=p2;p2=t;1000 5 a 1002 9 b main()int a,b;scanf(“%d,%d”,2006 t T10-3-1.c,5,9,5,9,5,例 不用指针变量作函数参数,将两个整数按大小顺序输出。,怎样直接修改a、b的值呢?,修改原件用指针!,指针变量作为函数的参数 可将指针变量作函数的参数,接受实参地址,获得具体
6、指向,进而通过指针变量间接访问主调函数的变量。,例T10-3.c用指针变量作函数参数,将两个整数按大小顺序输出。swap(int*p1,int*p2)int t;t=*p1;*p1=*p2;*p2=t;1000 5 a 1002 9 b main()int a,b;scanf(“%d,%d”,2006 t,1000,1002,5,9,5,重要概念:使用指针变量作函数参数,被调函数可以将多个结果交给主调函数。数组名做参数,可返回该数组所有元素 还记得那个求成绩最高、最低和平均值的例子?还需要用全局变量吗?,例T10-4-2.c:求n个数的最大值、最小值和平均值。float aver(int a,
7、int n,int*max,int*min)int i;float s=0;*max=a0;*min=a0;for(i=0;i*max)*max=ai;if(ai*min)*min=ai;return(s/100);,main()int a100,i,max,min;float av;for(i=0;i100;i+)scanf(“%d”,例T10-4-1.c:编写函数,求一元二次方程的两个实根。#include“math.h”?root(float a,float b,float c,)float d;d=b*b-4*a*c;if(d0|a=0)return(0);?=(-b+sqrt(d)/
8、2/a;?=(-b-sqrt(d)/2/a;return(1);,float*x1,float*x2,*x1,*x2,int,main()int k;float a,b,c,x1,x2;scanf(“%f,%f,%f”,输入:1,-10,25输出:5.000000,5.000000,函数参数:如不需改变(只读):一般参数如需改变(读写):指数参数,103 数组的指针和指向数组的指针变量数组有一个首地址:数组的指针。每个数组元素也都有地址:数组元素的指针。,5,3,2,1,6,8,7,4,2000,2002,2004,2006,指向数组元素的指针变量 int a10,*p;p=a;指向数组 p=
9、指向数组元素,5,1,2,4,7,6,8,0,3,9,2000,2002,2004,2006,p,通过指针引用数组元素 int a10,*p;p=其中p+1指向a1注意:p+1不是地址加1,而是加一个数据类型单位。,一般地,当p指向a0时,即p=,举例:用三种方法输出数组元素例T10-5-1.c 用“数组名+下标”的方法main()int i,a5;for(i=0;i5;i+)scanf(“%d”,输入:55 66 77 88 99,输出:&a0=ffce,a0=55&a1=ffd0,a1=66&a2=ffd2,a2=77&a3=ffd4,a3=88&a4=ffd6,a4=99,举例:用三种方
10、法输出数组元素例T10-5-2.c 计算“数组名计算地址”的方法main()int i,a5;for(i=0;i5;i+)scanf(“%d”,a+i);for(i=0;i5;i+)printf(“a+%d)=%x,*(a+%d)=%d n”,i,(a+i),i,*(a+i);,输出:(a+0)=ffcc,*(a+0)=55(a+1)=ffce,*(a+1)=66(a+2)=ffd0,*(a+2)=77(a+3)=ffd2,*(a+3)=88(a+4)=ffd4,*(a+4)=99,举例:用三种方法输出数组元素例T10-5-3_new.c 用“指针变量+下标”的方法(指针法I)main()in
11、t*p,a5,i;p=a;for(i=0;i5;i+)scanf(“%d”,p+i);for(i=0;i5;i+)printf(,输出:&p0=12ff6c,p0=55,*(p+0)=55&p1=12ff70,p1=66,*(p+1)=66&p2=12ff74,p2=77,*(p+2)=77&p3=12ff78,p3=88,*(p+3)=88&p4=12ff7c,p4=99,*(p+4)=99,举例:用三种方法输出数组元素(例T10-5-4_new.c)用“指针变量指向数组元素”法(指针法II)main()int*p,a5;for(p=a;p(a+5);p+)scanf(“%d”,p+i);f
12、or(p=a;p(a+5);p+)printf(“p=%x,*p=%d n”,p,*p);,输出:p=12ff6c,*p=55p=12ff70,*p=66p=12ff74,*p=77p=12ff78,*p=88p=12ff7c,*p=99,p+:合法,因p是指针变量,而变量可以用+运算符的a+:不合法,因为a是数组名,其值是数组元素的首地址,分配之后不可变。,举例:用三种方法输出数组元素(例T10-5-4.c)指针变量当作数组名使用(混合指针法)main()int a5,*p=a,i;for(p=a;pa+5;p+)scanf(“%d”,p);p=a;/不能漏!for(i=0;i5;i+)pr
13、intf(“,输出:&p0=12ff6c,p0=55,*(p+0)=55&p1=12ff70,p1=66,*(p+1)=66&p2=12ff74,p2=77,*(p+2)=77&p3=12ff78,p3=88,*(p+3)=88&p4=12ff7c,p4=99,*(p+4)=99,通过指针引用数组元素的方法小结例:累加求和的各种用法:int*p,a10;s=0;p=a;for(i=0;i10;i+)s+=ai;for(i=0;i10;i+)s+=*(a+i);for(i=0;i10;i+)s+=*(p+i);for(i=0;i10;i+)s+=pi;for(i=0;i10;i+)s+=*p+;
14、for(p=a;pa+10;p+)s+=*p;最后一种用法效率高。,数组元素地址法,指针法I指针变量指向数组元素,指针法II指针变量当作数组名注意不能使用a+,指针变量使用时的几个问题,若p当前指向a数组的第i个元素,则:10-plus.c*p:是取出ai的值.p+:指针指向ai+1.*p+:等价于*(p+)及ai+,优先级同为2,从右向左结合,将 ai 的值取出,后再使 p增1(不是单纯的加一,是p指向ai+1).*(+p):与a+i等价,先将p指向ai+1,然后将该元素取出.(*p)+:将p所指的数组元素ai的值取出,使ai的值增1.p-:指针指向ai-1.*(p-):与ai-等价,将p
15、所指向的第i个数组元素取出,然后使p指向i-1元素.*(-p):与a-i等价,先将p减1指向第i-1个元素,然后将其取出.(*p)-:将p所指的数组元素ai的值取出,使ai的值减1.,数组名作为函数参数 有了指针概念的基础上,重新回顾数组名作为函数参数时,数据的传递情况:void sort(int a,int n)void sort(int*a,int n),例:选择法排序函数,void sort(int*a,int n)例T10-7-1.c int i,j,t;for(i=0;iaj)t=ai;ai=aj;aj=t;只将形参改为指针变量,仍按下标法使用,void sort(int*a,int
16、 n)int i,j,t;for(i=0;i*(a+j)t=*(a+i);*(a+i)=*(a+j);*(a+j)=t;按指针法使用例T10-7-2.c,进一步优化:都用指针,效率更高!(例T10-7-3.c)void sort(int*a,int n)int*i,*j,t;for(i=a;i*j)t=*i;*i=*j;*j=t;main()int a10,j;for(j=0;j10;j+)scanf(“%d”,a+j);sort(a,10);for(j=0;j10;j+)printf(“%5d”,aj);,分段排序?例T10-7-4.c main()int a10,j;for(j=0;j10
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- c语言程序设计 樊媛媛 语言程序设计 10 指针
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-5992284.html