第6章中间部分 指针和引用[1].ppt_第1页
第6章中间部分 指针和引用[1].ppt_第2页
第6章中间部分 指针和引用[1].ppt_第3页
第6章中间部分 指针和引用[1].ppt_第4页
第6章中间部分 指针和引用[1].ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、第七章 指针和引用,7.4 用指针操作字符串 字符串的首地址称为字符串的指针。 字符串的指针也是指向字符串的指针变量。 当将一个字符串的首地址赋值给一个指针变量后,这个指针变量就指向了那个字符串。 一个指针变量指向某个字符串后,可以用这个指针变量操作该字符串。 既可用单个指针变量操作一个字符串,也可用指针数组或二级指针操作多个字符串。,字符串如前所述,是一维字符型数组。所以前面所讲的内容基本上可适用于字符串。但还有一些特点。 字符串的定义和赋初值:前面讲过,字符数组可如下定义并赋初值: char a=Hello; 但像这样: char a10; a=Hello; 定义和赋值分开不行。因为 a

2、是数组名,不能赋值。 但用指针情况不同。上例使用指针时: char *s=“Hello”; 可以。 char *s; s=“Hello”; 也行。 这是因为 s 是指针,上面语句理解为先定义一个字符串 “Hello”,再把其首地址赋给 s ,s 的值可变,故是合法的。而前面,a 是数组名,它代表 cina; 是正确的。但: char *s; cins; 则不行。 这是因为 s 没有赋值,指向不知何处,上面把键盘输入送到该处,会引起不可知的后果。因此,要: char a20,*s; s=a; cins; 有了这些概念,字符串处理和一维数组一样,可用指针进行。例如字符串复制,有库函数 strcpy

3、(s1,s2) 。如果要自己写一个程序来复制字符串,用指针处理,如何写? #include main() char *a=“This is a computer”; char b20; /* 要把字符串 a 复制到字符串 b */,/* 可以用两种方法 */ /* 用下标 */* 用指针 */ int i; | char *s=a, *d=b; for (i=0; ai!=0; i+) | for (; *s!=0; s+) bi=ai; | *d=*s; d+; bi=0; | *d=0; /* 补上结束的0 */ coutb;/* 打印字符串 b */ 可见概念上没有什么新的。 上面的程序

4、可以更简化一些。字符串复制的循环可写为: while (*d+=*s+)!=0) ; 或for (; (*d+=*s+)!=0; ) ; 或更简单:while (*d+ = *s+) ;,字符串 指针使用的几个问题: 1. 指针必须先赋值,才能使用。否则指针不知指向何处,访问时,会引起不可知的后果,前面已经讲过。 2. 指针值是可以改变的。如: char *s=“Hello world!”; s+=6; couts; 输出 world! ,指针 s 已指向 w 。 3. 可以用指针访问字符串中的某些元素。如: char *s = “Hello world!”; couts+8; 则输出字符 “

5、rld!” 。,7.4.1 用字符型指针变量操作字符串 用指针变量操作字符串的一般步骤是: 定义指针变量和字符串; 用指针变量指向字符串; 用指针变量操作字符串。 从形式上看,可以有两种方法将一个指针变量指向一个字符串:,使用字符型数组定义字符串,然后定义字符型指针变量,将指针指向字符串。 例如:char str20= abc; char *pc=str; 这时,指针变量pc就指向了数组的首地址,即字符串的首地址。 执行语句 for( ; *pc!=0;+pc); 后,pc-str为字符串str的长度。注意:str作为数组名是地址常量,不允许有+str,但可以有+pc。,(2) 不定义字符型数

6、组,直接定义字符型指针变量,为其赋值为一个字符串。例如: char *pc; pc=abcd; 系统首先为字符串常量abcd分配内存空间,然后将指针pc指向字符串的首地址。也可在定义指针时进行初始化,例如: char *pc=abcd; 最后就可以用pc操作这个字符串了。如 pc=pc+2; puts(pc); 输出结果为从字符c开始的字符串cd。,【例7-10】求字符串的长度。 #include void main() char *pc=abcdefg; int n=0; / n用作计数器 while(*pc!=0) n+; pc+; coutn; ,运行结果为: 7,程序中,首先将指针pc

7、指向字符串的首地址,即指向字符a,然后在循环过程中,判断pc指向的内容是否为空字符,如果不是空字符,则计数器加1,而且pc+将pc指向字符串中的下一个字符,直到pc指向字符串末尾的空字符循环结束。注意:其中的“*pc!=0”也可写成“*pc!=0”或“*pc”。,注意在语句中: char *p; p=abc; p是变量可以赋值(p=abc;) 用数组表示字符串时,数组名不能赋值。如 char str20; str=abc; 是不允许的。 当指针变量p指向一个字符串str后,pi就是p的当前值开始的str中第i个元素。,例:使用指向char型的指针变量在已知字符串中删除指定字符。程序如下: #i

8、nclude #include void main() int i, j; char ch, a10,*str=a; cinstr; ch=getchar(); for(i=0,j=0; stri!=0; +i) if(stri!=ch) strj+=stri; strj=0; puts(str); ,for(i=0;stri!=0;+i) if(stri=ch) break; for(;stri!=0;) stri-1=str+i; 这只能删除第一个出现的指定字符。,7.4.2 用字符型指针数组操作多个字符串 在前面曾使用二维char型数组str处理多个字符串:,(在程序中使用固定行长的二维

9、数组) char str3N; int i; for(i=0;i3;+i) gets(stri);,使用固定行长的二维数组操作多个字符串往往造成空间和时间浪费。 实践中常常采用指针数组处理多个字符串。 下面的例子可以看到,这种方法既节省运行时间又节省存储空间。,例: 使用指针数组实现字符串排序(1)。 程序如下: #include #include,void main() int i,j,k; char *p; char *name5,for(i=0;i0 ) k=j; if(k!=i) p=namek,namek=namei, namei=p; for(i=0;i5;+i) puts(nam

10、ei); ,= BEIJING, SHANGHAI, TIANJIN, GUANGZHOU, SHENYANG” ;,上面用变量初始化方法将指针数组中的每个指针变量各指向一个字符串常量。还可以用赋值法: char *name5; name0=BEIJIN; name1=SHANGHAI; name2=TIANJIN; name3=GUANGZHOU; name4=SHENYANG;,下例中逐个从外部设备输入字符串: 例: 使用指针数组实现字符串排序(2) 程序如下: #include #include,void main() char *p100, w3000, *q=w, *s ; int

11、i, j, n, k; coutn; if(npi=q; q+=strlen(q)+1; ,输入n个字符串,for(i=0;i0) k=j; if(k!=i) s=pk,pk=pi,pi=s; ,使用指针数组实现 n个字符串排序,coutn sorted list:; for(i=0;in;+i) coutn“pi; else coutn Too many strings:only 100 allowed; ,输出n个字符串,在使用指针数组处理字符串时,要注意避免使用未赋值的指针变量。如: char *p5; for(i=0;ipi; 使用了未赋值的指针变量pi。 正确作法是先让pi指向一个确定的地址,再用它接受一个字符串。,【例7-11】使用字符型

温馨提示

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

评论

0/150

提交评论