数组的指针和字符串的指针.ppt_第1页
数组的指针和字符串的指针.ppt_第2页
数组的指针和字符串的指针.ppt_第3页
数组的指针和字符串的指针.ppt_第4页
数组的指针和字符串的指针.ppt_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

一、数组的指针1.数组与地址2.数组元素的访问二、字符串指针1.字符串指针的定义2.字符指针与字符数组的区别三、指针作为函数参数1.数组名作为函数参数2.字符指针作为函数参数,第16讲数组的指针和字符串的指针,C语言规定:数组名代表数组(元素)的首地址,即第一个元素的地址。若有:inta10,*p=a;则:a与a0是等价的指针变量p为数组的指针数组的指针:数组的起始地址,即数组元素的首地址。数组元素的指针:数组元素的地址。,一、数组的指针,1.数组与地址,对数组的首地址加上偏移量x就可以得到其它元素的地址。例:a1表示数组元素a1的地址等价于a+1、p+1ax表示数组元素ax的地址等价于a+x、p+x,2.数组元素的访问,下标法:用ai的形式存取数组元素。地址法:用*(a+i)的形式存取数组元素。指针法:用指针变量p指向数组的首地址,然后通过移动指针存取数组元素。如p=a,p+i。,例a用下标法存取数组元素,main()inta10,i;for(i=0;i10;i+)scanf(%d,例b用地址法存取数组元素,main()inta10,i;for(i=0;i10;i+)scanf(%d,a+i);for(i=0;i10;i+)printf(%d,*(a+i);printf(n);,数组元素的访问举例,例c用指针法存取数组元素。(即通过指针指向数组的首地址,然后通过移动指针存取数组元素。),main()inta10,*p,i;for(i=0,p=a;i10;i+)scanf(%d,p+i);for(i=0,p=a;i10;i+)printf(%d,*(p+i);printf(n);,main()inta10,*p;for(p=a;pa+10;p+)scanf(%d,p);for(p=a;pa+10;p+)printf(%d,*p);printf(n);,例c说明,p=p=a+2;(*p)+;printf(%dn,*p);程序段输出为:5,例,main()inta5=0,2,4,6,8,*p,x;p=a;(*p)+;p=a+1;+(*p);p=a+2;(*p)-;p=a+3;-(*p);for(x=0;x=4;x+)printf(%d,ax);printf(n);,程序运行结果:13358,指向数组元素的指针也可以表示成数组的形式,即允许指针变量带下标,如*(p+i)可以表示成pi。但需注意,如果p不指向a0,则pi和ai是不一样的。如p=a+3;由于p指向a3,所以p3就相当于a6而不是a3。这种方式容易出错,一般不提倡使用。,字符串的处理是用字符型数组来实现的。用char型数组处理的字符串都可以用char型指针来处理。通常把char型指针称为字符串指针或字符指针。,二、字符串指针,在程序中定义一个字符指针变量,并将字符串的首地址赋给它,然后通过字符指针变量来访问字符串。例如:charstr=Cprogramming;char*p;p=str;或:char*str=Cprogramming;,1.字符串指针的定义,例:,/*用字符数组实现字符串操作*/main()charstr=WelcometostudyC!;inti;printf(%sn,str);for(i=0;i=7;i+)printf(%c,stri);printf(n);,程序运行结果为:WelcometostudyC!Welcome,例,/*用字符指针实现字符串操作*/main()char*str=WelcometostudyC!;inti;printf(%sn,str);for(i=0;i=7;i+)printf(%c,*(str+i);printf(n);,字符指针与字符数组的区别,字符数组是由若干个元素组成,每个元素存放一个字符;而字符指针变量存放的是字符串的首地址。赋值方式不同。字符数组只能对各个元素分别赋值,而字符指针只需赋给字符串的首地址就可以了。字符指针占用的内存要少于字符数组。指针变量的值是可以改变,而字符数组的数组名虽然代表地址,但它的值是不会变化。,区别举例:,如:char*str;str=WelcometostudyC!;以下对字符数组的赋值是错误的:charstr80;str=WelcometostudyC!;,例将字符串s1复制到字符串s2。,main()chars1=“copystring”,s230;char*p1=s1,*p2=s2;inti;for(;*p1!=0;p1+,p2+)*p2=*p1;*p2=0;printf(“strings2=”);for(i=0;s2i!=0;i+)printf(“%c”,s2i);printf(“n”);,程序运行结果为:strings2=Copystring,1.数组名作为函数参数,特点:数组名表示数组元素的首地址。在函数调用时,传递的是数组元素的首地址。实参与形参的传递是“值传递”。实参数组与形参数组共用一段存储单元。可以用指向数组的指针变量作函数的参数。,三、指针作为函数参数,以下列出实参和形参使用数组名或指针变量的四种情况:实参:数组名数组名指针变量指针变量形参:数组名指针变量数组名指针变量,例:已知一个一维数组a11中有10个数,求出其中前n个数的和,并放入a10中。其中n由键盘输入。,#includesum(int*q,intn)inti,s=0;int*t;t=q;/*t与q都指向数组a的第一个元素*/for(i=0;in;i+,q+)s+=*q;*(t+10)=s;/*t+10指向数组元素a10*/,main()intnum,a11=1,2,3,4,5,6,7,8,9,10;int*p=a;scanf(%d,将一个字符串从一个函数传递到另一个函数,可以使用地址传递的方法,即用字符数组名作为参数或用指向字符串的指针变量作为参数。在被调用函数中可以改变字符串的内容,而在主调函数中可以得到被改变了的字符串。由于字符串是按照字符数组形式存储的,所以对字符串中字符的引用也可以用下标法或指针法。,2.字符指针作为函数参数,例设有两个字符串Hello和World!,试将它们连接在一起成为一个字符串。,main()charstr115=Hello,str2=World!;inti;strcat(str1,str2);printf(Stringstr1=%sn,str1);strcat(char*s,char*t)while(*s!=0)s+;/*使s指向字符串str1的末尾*/while(*t!=0)*s=*t;t+;s+;*s=0;/*在s后加上字符串结束标志*/,程序运行结果为:Stringstr1=HelloWorld!,例输入一串小写字符将其转换为大写字符,main()inti;chara100;printf(“Inputn”);scanf(“%s”,a);utol(a);printf(%sn,a);,utol(char*x)inti;for(i=0;*(x+i)!=0;i+)*(x+i)-=32;,例:编写一个函数string_cut(char*str,charc),如果字符串str中包含字符变量c,则输出其后的字符序列,否则输出空字符。,#includestring_cut(char*str,charc)for(;*str!=0,voidmain()charstring20=Beijing;charch;scanf(%c,例:有3个字符串存放在一维指针数组中,编写一个程序,找出3个串中ASCII码最大的一个字母并输出。,分析:类似于二维数组,在每个字符串中查找最大的字

温馨提示

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

评论

0/150

提交评论