《c语言的指针》PPT课件.ppt_第1页
《c语言的指针》PPT课件.ppt_第2页
《c语言的指针》PPT课件.ppt_第3页
《c语言的指针》PPT课件.ppt_第4页
《c语言的指针》PPT课件.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 指 针,指针 指针与数组的关系 指针数组,指针,指针,直接访问: 通过变量名直接访问地址,间接访问: 把变量x的地址放到另一变量px中,使用时先找到px的地址,从中取出x的地址,int x=3; printf(“%d”,x);,指针,指针变量:存放地址的变量(px=&x),int x; x=3;printf(“%d”,x);,变量x的地址(&x),指向,指向,指针变量的定义,类型名 *指针变量名;,指针变量所指向变量的类型,int *px; float *pf; char *pc;,px是int 指针,指向int变量 pf是float型指针,指向float型变量 pc是字符char型指针,指向char型变量,指针的基本操作,1、 把a的地址赋给p,即p指向a * :目标运算符(间接访问运算符) *p:p所指向的变量a,例.指针运算 main() int a=3,*p; p= ,输出: 3,3 5,5 7,7 10,10,5,7,10,指针运算注意事项,当p&a后,*p与a相同 int a,*p=&a; 定义 *p10; p所指向的变量 3. &*p与p相同,是地址 *&a与a相同,是变量,10,指针运算注意事项,4. int a,*p (*p)+等价于a 将p所指向的变量值加1 *p+等价于*(p+) 先取*p,然后p自加,此时p不再指向a,a *p b,指针的基本操作,2、赋值 int *p1, *p2, a=3; p1= 把a的地址赋给p1,即p1指向a p2p1; p2也指向a,*p1 *p2,指针赋值,main() int a,b; int *p1,*p2; a=100;b=10; p1= ,输出:10,100,指针变量的初始化,main() int a1,b2; int *p1 = ,&a,p1,&b,p2,1,a,2,b,输出:1,2 2,1,&b,p1,指针变量的初始化,main() int a1,b2; int *p1 = ,输出:1,2 2,1,指针和一维数组,指针、数组、地址间的关系,指针、数组、地址间的关系,指针和数组有密切的关系 任何由数组下标来实现的操作 都能用指针来完成。,数组名是一个指针 它的值是数组首元素的地址&a0 即它指向数组的首元素a0,a,int a10;,a+1,a+9,指针、数组、地址间的关系,int *p,a10; p指向数组a的首元素: p=&a0;或:pa;,p、a a+1 a+i &ai a+9,ai的地址相当于:&ai、a+i、p+i ai相当于:*(a+i)、 *(p+i)、pi,int a20,*p=a; p+3相当于:p=(p)+3*sizeof(int)=(p)+3*2 float b20,*pb= pb+3相当于:pb=(pb)+3*sizeof(float)=(pb)+3*4,输出数组a所有元素,for(i=0;i10;i+) printf(“%d”,ai);,for(p=a;pa+10;p+) printf(“%d”,*p);,for(i=0;i10;i+) printf(“%d”,*(a+i);,P、a a+1 a+i &ai a+9,!注意:数组名a是指针常量, a不能改变。 如:a是错误的,多维数组的指针表示,多维数组可看成是以下一级数组为元素的数组。 指针变量可以指向一维数组,也可以指向多维数组 1.指针变量指向多维数组的某个元素 int a23,*pa=&a12;,例:定义一个2行3列二维数组,为其输入数值,然后输出。 main( ) int a23,*pa,i,j; for (i=0;i2;i+) for (j=0;j3;j+) pa= ,多维数组的指针表示,2.指针变量指向多维数组的首地址 (1) int a23,*pa=a; (2) int a23,*pa= pa指向二维数组首地址后,引用第i行第j列数组元素的方法是: 第i行j列元素地址为:pa+i*列数+j 第i行j列元素为: *(pa+i*列数+j),例:重编上例,使用指向二维数组首地址的指针 变量处理二维数组元素。 main( ) int a23=1,2,3,4,5,6,*pa,i,j; pa= ,多维数组的指针表示,3.多维数组名作指针指向多维数组的各个元素 二维数组a的第i行j列元素可以用下列公式表示:*(*(a+i)+j) 如数组 a34=1,2,3,4,5,6,7,8,9,10,11,12 a是一个数组名。a数组包含3行,可被看成是由元素 a0、a1、a2组成的数组。而每一个元素又是 一个一维数组,它包含4个元素。 例如,ai(i=0,1,2)所代表的一维数组又包含 4个元素:ai0、ai1、ai2、ai3。,a1=*(a+1) a1是第二行的首地址 a12=*(a1+2)=*(*(a+1)+2) aij=*(ai+j)=*(*(a+i)+j),多维数组的指针表示,4.指针变量指向多维数组中的某个一维数组 定义一个指针指向二维数组中的一维数组。 (1) int a34, (*pa)4=a; (2) int a34, (*pa)4; pa=a; /*pa是指向具有4个元素的一维数组的指针*/ 第i行j列元素地址为:*(pa+i)+j 等价于*(a+i)+j 第i行j列元素为:(*(pa+i)j或*(*(pa+i)+j),例:使用指向一维数组的指针变量处理二维数组元素。 main( ) int a34,(*pa)4=a; int i,j; printf(“n input array:n“); for (i=0;i3;i+) for (j=0;j4;j+) scanf(“%d“,*(pa+i)+j); printf(“output array:n“); for (i=0;i3;i+) for (j=0;j4;j+) printf(“%4d“,(*(pa+i)j); printf(“n“); printf(“output array:n“); for (i=0;i3;i+) for (j=0;j4;j+) printf(“%4d“,*(*(pa+i)+j); printf(“n“); ,运行情况如下: input array: 1 2 3 4 5 6 7 8 9 10 11 12 output array: 1 2 3 4 5 6 7 8 9 10 11 12 output array: 1 2 3 4 5 6 7 8 9 10 11 12,指针和字符串,字符串的指针表示 字符数组和字符指针,字符串的指针表示,用字符数组表示字符串 char s=“This is a string.”; printf(“%s”,s); 用字符指针表示字符串 char *p=“This is a string.”; printf(“%s”,p); 字符串的地址就是字符串的 首地址,它是一个指针常量,s17,0,.,g,si *(s+i),n,s1,h,s0,T,s、p s+1 s+i &si s+17,char s20,*p=s; s=“This is a string.”; s=“This is a string.”; p=“This is a string.”;,strcpy(s,”This is a string.”);,数组名是指针常量, 有确定的地址 指针是变量,指针加1和减1运算,指针加(减)1的含义是使指针指向后一个(前一个)数据 例如: char *s=“this is string”; while(*s) putchar(*s+);,char *s=“How are you“,ch; ch=*s+; /*ch=*(s+),取出s当前所指单元的内容, 然后s指向下一个元素*/ ch=*+s; /*ch=*(+s),移动s指向下一个元素,然后 取出s所指单元的内容*/ ch=+*s; /*ch=+(*s),把s所指单元的内容增1,然 后取出s单元的内容*/ ch=(*s)+;/*ch=(*s)+,取出s所指单元的内容,然后 该单元的内容加1*/,指针相减运算,指针相减的含义是求两指针指向的元素之间的元素个数。 例:求字符串的长度。 main( ) char s256, *p; printf(“Enter a string:n“); gets(s); p=s; while (*p) p+; printf(“The string length:%dn“,p-s); ,字符数组和字符指针,指针的关系运算,两个指向相同数据类型的指针之间可以进行关系运 算,关系运算体现指针地址值大小的关系。 (高于) =(高于或等于) =(指向同一位置) !=(不指向同一位置),例:用指针方式实现字符串全部字符首尾颠倒。 #include “string.h“ main( ) char ss80,*p,*q,*s=ss,c; int k; printf(“Input a stringn“); scanf(“%s“,s); printf(“%sn“,s); p=s; k=strlen(s); for (q=s+k-1;pq;p+,q-) c=*p; *p=*q; *q=c; printf(“%sn“,s); ,运行情况如下: Input a string banana banana ananab,例:把字符串t复制到字符串s中。 main() char s20,t20; char *ps=s,*pt=t; printf(“nEnter a string:n“); scanf(“%s“,pt); while (*ps+=*pt+)!=0) ; printf(“Output copied string:n“); printf(“%sn“,s); ,例:以不同的字符表达形式求字符串的长度。 main() char *ps=“I am a student“; int len=0,i; while (*ps+!=0) /*指针加1,指向后一个字符*/ len+; printf(“n(1) length=%d“,len); ps-=len+1; i=0; len=0; while (psi!=0) /*注意指针和数组名的关系*/ len+; i+; printf(“n(2) length=%d“,len); i=0; len=0; while (*(ps+i)!=0) /*不修改字符指针*/ len+; i+; printf(“n(3) length=%d“,len); ,main() char s110=“abcd“,s2 =“ef“; char *p1=s1,*p2=s2; while(*p2!=0) *p1=*p2; p2+; p1+; *p1=0; Printf(“%s”,s1); ,指针数组,指针数组 指针数组和字符串,int a10; a,int *pa10; pa,x,指针数组,pa是一个数组,它有10个元素,每个元素的类型都是整型指针。,int i,j,k,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论