好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C语言指针详细讲解ppt课件.ppt

45页
  • 卖家[上传人]:cn****1
  • 文档编号:585359022
  • 上传时间:2024-09-02
  • 文档格式:PPT
  • 文档大小:1.13MB
  • / 45 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人指针的概念指针变量指针与数组指针与函数返回指针值的函数 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人Ø前言C程序设计中使用指针可以:–使程序简洁、紧凑、高效–有效地表示复杂的数据结构–动态分配内存–得到多于一个的函数返回值 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人指针的概念–变量与地址程序中: int i; float k; 内存中每个字节有一个编号-----地址…...…...2000200120022005内存02003ik 编译或函数调用时为其分配内存单元变量是对程序中数据存储空间的抽象 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人…...…...2000200420062005整型变量i10变量i_pointer200120022003指针:一个变量的地址地址指针变量:专门存放变量地址的变量叫~2000指针指针变量 变量的内容 变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量指针与指针变量 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人&与*运算符•含义含义: 取变量的地址单目运算符优先级: 2结合性:自右向左含义: 取指针所指向变量的内容单目运算符优先级: 2结合性:自右向左两者关系:互为逆运算理解…...…...2000200420062005整型变量i10变量i_pointer2001200220032000指针变量i_pointer-----指针变量,它的内容是地址量*i_pointer----指针的目标变量,它的内容是数据&i_pointer---指针变量占用内存的地址200010i_pointer*i_pointer&i_pointerii_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i) 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人直接访问与间接访问•直接访问:按变量地址存取变量值•间接访问:通过存放变量地址的变量去访问变量例 i=3; -----直接访问指针变量…...…...2000200420062005整型变量i10变量i_pointer20012002200320003例 *i_pointer=20; -----间接访问20 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人指针变量…...…...2000200420062005整型变量i10变量i_pointer2001200220032000整型变量k例 k=i; --直接访问 k=*i_pointer; --间接访问10例 k=i; k=*i_pointer; 例子图解 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人2 指针变量指针变量与其所指向的变量之间的关系指针变量的定义一般形式: [存储类型] 数据类型 *指针名;3变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=33变量i2000i_pointer*i_pointeri*i_pointer&ii_pointeri=3;*i_pointer=3合法标识符指针变量本身的存储类型指针的目标变量的数据类型表示定义指针变量不是‘*’运算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 与 int *p1, p2;2、指针变量名是p1,p2 ,不是*p1,*p23、指针变量只能指向定义时所规定类型的变量4、指针变量定义后,变量值不确定,应用前必须先赋值 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人指针变量的初始化•一般形式:[存储类型] 数据类型 *指针名=初始地址值;赋给指针变量,不是赋给目标变量例 int i; int *p=&i;变量必须已说明过类型应一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指针变量作初值例 main( ) { int i; static int *p=&i; .............. } ()不能用auto变量的地址去初始化static型指针 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人例 main( ) { int i=10; int *p; *p=i; printf(“%d”,*p); }危险!例 main( ) { int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); }…...…...2000200420062005整型变量i10指针变量p200120022003随机指针变量必须先赋值,再使用 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人零指针:(空指针)定义:指针变量值为零表示: int * p=0; p指向地址为0的单元,系统保证该单元不作它用表示指针变量值没有意义#define NULL 0int *p=NULL:p=NULL与未对p赋值不同用途: 避免指针变量的非法引用在程序中常作为状态比较 例 int *p; ...... while(p!=NULL) { ...… }void *类型指针表示: void *p; 使用时要进行强制类型转换例 char *p1; void *p2; p1=(char *)p2; p2=(void *)p1;表示不指定p是指向哪一种类型数据的指针变量零指针与空类型指针 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人main(){ int *p1,*p2,*p,a,b; scanf("%d,%d",&a,&b); p1=&a; p2=&b; if(ap2 表示p1指的元素在后p1==p2 表示p1与p2指向同一元素若p1与p2不指向同一数组,比较无意义p==NULL或p!=NULL指针变量的关系运算 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人a[0]a[1]a[2]a[3]a[9]...aa+9a+1a+2地址元素下标法a[0]a[1]a[2]a[9]a[0]a[1]a[2]a[3]a[9]...pp+9p+1p+2地址元素指针法*p*(p+1)*(p+2)*(p+9)[] 变址运算符a[i]  *(a+i)a[i]  p[i]  *(p+i) *(a+i)*a*(a+1)*(a+2)*(a+9)p[0]p[1]p[2]p[9] 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人a[0]a[1]a[2]a[3]a[4]main(){ int a[5],*pa,i; for(i=0;i<5;i++) a[i]=i+1; pa=a; for(i=0;i<5;i++) printf("*(pa+%d):%d\n",i,*(pa+i)); for(i=0;i<5;i++) printf("*(a+%d):%d\n",i,*(a+i)); for(i=0;i<5;i++) printf("pa[%d]:%d\n",i,pa[i]); for(i=0;i<5;i++) printf("a[%d]:%d\n",i,a[i]);}12345pa例 数组元素的引用方法 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人例 int a[]={1,2,3,4,5,6,7,8,9,10},*p=a,i; 数组元素地址的正确表示:(A)&(a+1) (B)a++ (C)&p (D)&p[i]数组名是地址常量p++,p-- ()a++,a-- ()a+1, *(a+2) () 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人例 void main() { int a []={5,8,7,6,2,7,3}; int y,*p=&a[1]; y=(*--p)++; printf(“%d ”,y); printf(“%d”,a[0]); } 输出:5 6pp58762730123456a6例 注意指针变量的运算 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人main(){ int i,*p,a[7]; p=a; for(i=0;i<7;i++) scanf("%d",p++); printf("\n"); for(i=0;i<7;i++,p++) printf("%d",*p);}p=a;pp58762730123456apppppp指针变量可以指到数组后的内存单元例 注意指针的当前值 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人数组名作函数参数,是地址传递数组名作函数参数,实参与形参的对应关系实参形参数组名指针变量数组名指针变量数组名数组名指针变量指针变量数组名作函数参数 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723实参与形参均用数组void inv(int x[], int n){ int t,i,j,m=(n-1)/2; for(i=0;i<=m;i++) { j=n-1-i; t=x[i]; x[i]=x[j]; x[j]=t; }}main(){ int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n");}m=4例 将数组a中的n个整数按相反顺序存放(1) 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人void inv(int *x, int n){ int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; }}main(){ int i,a[10]={3,7,9,11,0,6,7,5,4,2}; inv(a,10); printf("The array has been reverted:\n"); for(i=0;i<10;i++) printf("%d,",a[i]); printf("\n");}￿实参用数组,形参用指针变量37911067542a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]xp=x+ma数组60711594723ijijijjiji例 将数组a中的n个整数按相反顺序存放(2) 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人void inv(int *x, int n){ int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i<=p;i++,j--) { t=*i; *i=*j; *j=t; }}main(){ int i,a[10],*p=a; for(i=0;i<10;i++,p++) scanf("%d",p); p=a; inv(p,10); printf("The array has been reverted:\n"); for(p=a;pvoid swap(int *r,int *s){ int *t; t=r; r=s; s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(p,q); printf("%d,%d\n",*p,*q);}20022000COPY 指针变量s 指针变量r(swap) 指针变量t200020022000例 一级指针与二级指针图解1 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人20002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q2002#include void swap(int *r,int *s){ int *t; t=r; r=s; s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(p,q); printf("%d,%d\n",*p,*q);}输出: 1,2例 一级指针与二级指针图解2 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人#include void swap(int *r,int *s){ int *t; t=r; r=s; s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(p,q); printf("%d,%d\n",*p,*q);}abpqabpqrsabpqsrabpq输出: 1,2例 一级指针与二级指针图解3 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人#include void swap(int **r,int **s){ int *t; t=*r; *r=*s; *s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(&p,&q); printf("%d,%d\n",*p,*q);}20002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q200220062004COPY 二级指针s 二级指针r(swap) 指针变量t200020022000例 一级指针与二级指针图解4 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人#include void swap(int **r,int **s){ int *t; t=*r; *r=*s; *s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(&p,&q); printf("%d,%d\n",*p,*q);}20002008200A20022004200612变量a 变量b(main) 指针变量p2000 指针变量q200220002002输出: 2,1例 一级指针与二级指针图解5 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人#include void swap(int **r,int **s){ int *t; t=*r; *r=*s; *s=t;}main(){ int a=1,b=2,*p,*q; p=&a; q=&b; swap(&p,&q); printf("%d,%d\n",*p,*q);}abpqbapqabrspqabrspq输出: 2,1例 一级指针与二级指针图解6 烧伤病人的治疗通常是取烧伤病人的健康皮肤进行自体移植,但对于大面积烧伤病人来讲,健康皮肤很有限,请同学们想一想如何来治疗该病人定义含义int i;int *p;int a[n];int *p[n];int (*p)[n];int f();int *p();int (*p)();int **p;定义整型变量ip为指向整型数据的指针变量定义含n个元素的整型数组an个指向整型数据的指针变量组成的指针数组pp为指向含n个元素的一维整型数组的指针变量f为返回整型数的函数p为返回指针的函数,该指针指向一个整型数据p为指向函数的指针变量,该函数返回整型数p为指针变量,它指向一个指向整型数据的指针变量指针的数据类型 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.