字符指针与字符串
C语言把字符串存放在字符数组中,通过数组名可以访问字符串或字符串中的某个字符。实际上,使用字符型指针(简称字符指针)可以更加灵活和方便地使用字符串。
使用字符指针访问字符串时,需要把字符串的地址(第1个字符的地址)存放到字符指针变量中,可以使用如下两种方式:
(1)字符指针变量的初始化方式。例如:
char *str=" Welcome to C";//定义并初始化字符指针变量str
(2)赋值方式。例如:
char str: //定义字符指针变量
str="Welcome to C"; //给指针变量赋值
需要说明的是,上述两种方式不是把整个字符串存放到指针变量中,而是把字符串的第1个字符的地址存放到指针变量中,此时称字符指针指向了一个字符串。
无论是使用初始化方式还是赋值方式,字符指针指向的均是字符串常量,因此这种情况下,只能引用字符串,而不能对字符串进行修改。如果要在程序中修改字符串内容,需要把字符串存放到字符数组中。
使用字符指针变量指向字符串后,程序中使用时,既可以用指针的间接访问方式逐个访问字符串中的数组;也可以把字符串作为一个整体,使用字符串处理函数对字符串进行各种操作。
例:阅读下面程序。源代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char *s1,*s2="Welcome to C";
char s[];
int len;
printf("%s\n",s2);
puts(s2);
strcpy(s,s2);
len=strlen(s2);
printf("len=%d\n",len);
for(s1=s2;*s1!='\0';s1++)
putchar(*s1);
return ;
}
使用puts, strlen字符串处理函数对字符串进行操作时,也是从字符串的第一个字符开始进行处理,碰到字符串结束标记'\0'时停止。
由于字符指针变量仅是保存一个字符串的首地址,并没有内存空间存放整个字符串,所以不能直接使用字符串的输入或复制函数把字符串存储到字符指针变量中。例如
char *p;//定义字符指针变量
gets(p);//错误的输入
strcpy(p,"hello") ; //错误的复制
【例】输入一个字符串,不使用 strlen求出字符串的长度。源代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char str[];
char * p;
printf("输入一个字符串:");
gets(str);//输入的字符串放在字符数组中
p=str;//p指向字符串第1个字符
while(*p!='\0')//p没有指向串结束标记时循环
p++;//p指向下一个字符
printf("字符串长度:%d\n",p-str);
return ;
}
程序运行结果: