首页 理论教育 C语言程序设计:指针应用

C语言程序设计:指针应用

时间:2023-10-29 理论教育 版权反馈
【摘要】:输出字符串中n个字符后的所有字符。用指针处理字符串应注意的几个问题:无论是通过初始化还是赋值方式使指针指向某个字符串时,指针中存放的只是字符串的首地址,不要误认为指针中存放的就是该字符串。故当一个指针多次赋值后,该指针将指向最新赋值的字符串,而原先存放的字符串就不能用该指针变量继续访问了。第5、6行使两个指针p1和p2分别指向两个字符数组的首地址。此时,指针p1指向了字符串1的末尾。

C语言程序设计:指针应用

【例7.18】输出字符串中n个字符后的所有字符。

程序内容如下:

1 #include<stdio.h>

2 void main()

3 {

4  char*p="this is a book";

5  int n=10;

6  p=p+n;

7  printf("%s\n",p);

8 }

程序结果如图7.24所示:

图7.24 例7.18程序结果图

【例题中关键问题说明】

在程序中对p初始化时,即把字符串首地址赋予p,当“p=p+10”之后,p指向字符“b”,因此输出为“book”。

指针处理字符串应注意的几个问题:

(1)无论是通过初始化还是赋值方式使指针指向某个字符串时,指针中存放的只是字符串的首地址,不要误认为指针中存放的就是该字符串。

这里需要注意:定义的指针变量只能指向一个字符变量或其他字符型数据,不能同时指向多个字符数据。

(2)字符型指针处理字符串时,由于每个字符串都占用各自的存储区,即使两个字符串完全相同,它们的地址也不一样。故当一个指针多次赋值后,该指针将指向最新赋值的字符串,而原先存放的字符串就不能用该指针变量继续访问了。

例如:

char*str="Pascal Language";

printf("%s\n",str);

str="C Language";

指针str起先指向“Pascal Language”,其后又指向“C Language”,“Pascal Language”并没有被“C Language”替换,而是两个字符串各自占用自己的存储单元,具有不同的起始地址。指针指向了“C Language”就不再指向“Pascal Language”,此时若没有其他指针指向“Pascal Language”的话,“Pascal Language”就不可访问了。

(3)单独使用指针只能处理字符串常量,不宜企图通过输入的方式处理任意字符串。请看下面的程序:

#include<stdio.h>

int main()

 char*s;

 gets(s);

 printf("%s\n",s);(www.xing528.com)

 return 0;

在程序规模很小,内存空间空余很大的时候,程序也能正常运行,但是这种方法是很不可靠的。编译系统只安排了指针变量s的地址,s中却没有确定的值,即没有确切的指向。当用输入函数scanf()或gets()输入时,没有确定的地址来存放该字符串,而将该字符串安排在常量存储区中并取其首地址作为s的值。随着程序规模的扩大,无“指向”指针的增加,当常量存储区不敷使用的时候,就可能占用其他变量甚至程序代码已经使用的存储空间,轻者造成混乱,重者使程序瘫痪。

【例7.19】编写程序将两个字符串连接在一起

程序内容如下:

1 #include<stdio.h>

2 void main()

3 {

4  char s1[40],s2[20],*p1,*p2;

5  p1=s1;

6  p2=s2;

7  printf("请输入字符串s1:");

8  gets(s1);

9  printf("请输入字符串s2:");

10  gets(s2);

11  while(*p1)

12   p1++;

13  while(*p1++=*p2++);

14   printf("连接后结果:%s\n",s1);

15 }

程序结果如图7.25所示:

图7.25 例7.19程序结果图

【例题中关键问题说明】

(1)第4行同时定义两个数组s1、s2和两个指针p1、p2。

(2)第5、6行使两个指针p1和p2分别指向两个字符数组的首地址。

(3)利用循环依次使p1自增,直到*p1是字符串结束符为止。此时,指针p1指向了字符串1的末尾。从该位置起,利用循环依次将*p2复制到*p1,直到*p2的内容为′\0′(字符串结束符)为止。字符串2连接到字符串1后,要保证连接后的字符串1一定有结束符。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈