C语言程序设计 第10章 指针

上传人:E**** 文档编号:89422851 上传时间:2019-05-25 格式:PPT 页数:60 大小:290KB
返回 下载 相关 举报
C语言程序设计 第10章  指针_第1页
第1页 / 共60页
C语言程序设计 第10章  指针_第2页
第2页 / 共60页
C语言程序设计 第10章  指针_第3页
第3页 / 共60页
C语言程序设计 第10章  指针_第4页
第4页 / 共60页
C语言程序设计 第10章  指针_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《C语言程序设计 第10章 指针》由会员分享,可在线阅读,更多相关《C语言程序设计 第10章 指针(60页珍藏版)》请在金锄头文库上搜索。

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;,程序经编译后,变量名就不复存在,以地址对应。,也可以采用“间接访问”方式

2、: 先将变量i的地址存放到另一变量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的指针变量。,1000,1002,1004,1000,1002,i,j,k,p1,p2,102 变量的指针 变量的指针 指针变量 指向变

3、量的指针变量 用“*”代表“指向” 如*p1代表它所指向的变量i,同一内存单元。 以下两个语句等价: i=3; 直接访问 *p1=3; 间接访问,内存用户数据 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=,指针变量的定义 指针变量也必须先定义后使用。 int *p1; 注意: *表示该变量为指针变量,但变量名是p1。 一个指针变量只能指向同一类型的变量。 int i,*p1; float a; p1= 不合法,指针变量的引用 两种用法: 用地址

4、运算符 不允许,例: main() int a=100,b=10; int *p1,*p2; 定义指针变量,尚无具体指向 p1= 注意:要区别定义和引用中的“*”,要特别注意以下用法的后果: int *p1; *p1=100;,例:输入a和b两个整数,按先大后小的顺序输出 main() int a,b,*p1, *p2, *p; scanf(“%d,%d”, 2004 p2 2006 p 改变p1和p2的指向,1000,1002,1002,1000,重要概念: 只要得到某变量的地址(指针),就可通过指针而不需通过逻辑名来访问该变量。 手段:用指针变量保存变量的地址。,指针变量作为函数的参数 可

5、将指针变量作函数的参数,接受实参地址,获得具体指向,进而通过指针变量间接访问主调函数的变量。,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,跨越逻辑上的限制,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 ,5,9,5,9

6、,重要概念:使用指针变量作函数参数,被调函数可以通过主调函数给定的地址去操作主调函数中的局部变量。 (可用于传递多个结果),例:编写函数,求一元二次方程的两个实根。 #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)/2/a; ? =(-b-sqrt(d)/2/a; return(1); ,float *x1, float *x2,*x1,*x2,int,main() int k; float a,b,c,xa,xb; scan

7、f(“%f,%f,%f”, ,例:求n个数的最大值、最小值和平均值。 float aver(int a, 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”, ,103 数组的指针 数组有一个首地址: 数组的指针。 每个数组元素也都有地址: 数组元素的指针。,5,3,2,1,

8、6,8,7,4,2000,2002,2004,2006,指向数组元素的指针变量 int a10,*p; p=a; 指向数组 p= 指向数组元素,5,1,2,4,7,6,8,0,3,9,2000,2002,2004,2006,p,通过指针引用数组元素 p= 其中p+1指向a1 注意:p+1不是地址加1,而是加一个数据类型单 位。,一般地,当p指向a0时: p+i a+i ,例:从键盘输入10个数到数组a: int a10,i,*p=a,s=0 for(i=0;i10;i+) scanf(“%d”,累加求和的各种用法: for(i=0;i10;i+)s+=ai; for(i=0;i10;i+)s+

9、=*(a+i); for(i=0;i10;i+)s+=*(p+i); for(i=0;i10;i+)s+=pi; for(i=0;i10;i+)s+=*p+; 等效于*(p+) for(p=a;pa+10;p+)s+=*p; 注意不能使用a+ 后两种用法效率高。,使用指针变量访问数组时,要特别注意指针变量的当前值。 注意下例: main() int a10,*p=a,i; for(p=a;pa+10;p+) scanf(“%d”,p); for(i=0;i10;i+)printf(“%d”,*p+); ,p,p=a;,数组名作为函数参数 有了指针概念的基础上,重新回顾数组名作为函数参数时,数据

10、的传递情况: 例:将数组a中的n个数按相反顺序存放。,int inv(int x, int n) i,j,m,t; main() m=(n-1)/2; for(i=0;i=m;i+) int a10,i; j=n-1-i; 输入a t=xi; inv(a,10); xi=xj; 输出a xj=t; a与x共用同一片内存单元,a,x,int inv(int *x, int n) 指针变量作函数参数时的传递情况 i,j,m,t; main() m=(n-1)/2; for(i=0;i=m;i+) int a10,i; j=n-1-i; 输入a t=xi; inv(a,10); xi=xj; 输出a

11、 xj=t; 下标法 ,a,1000,1000,x, j=n-1-i; t=*(x+i); *(x+i)= *(x+j); *(x+j)=t; 指针法,进一步优化: int inv(int *x, int n) main() int *i=x,*j=x+n-1,t; for(;ij;i+,j-) int a10,i; 输入a t=*i; inv(a,10); *i=*j; 输出a *j=t; 优点:简练 效率高,i,j,例:选择法排序函数,void sort(int *a, int n) int i,j,t; for(i=0;iaj)t=ai; ai=aj; aj=t; 只将形参改为指针变量,

12、仍按下标法使用,void sort(int *a, int n) int i,j,t; for(i=0;i*(a+j) t=*(a+i); *(a+i)= *(a+j); *(a+j)=t; 按指针法使用,进一步优化: 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); ,分段排序? main() int a10,j; for(j=0;j10;j+)scanf(“%d”,a+j); for(j=0;j10;j+)printf(“%5d”,aj); ,sort(a,5);,sort(a+5,5);,指向多维数组的指针和指针变量 从本质上说,多维数组的指针与一维数组的指针相

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

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

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