字符指针指向字符串的方法
由于字符串在内存中连续存储的特点,可以使用指针进行操作,并且指针必须是字符型的。通常将指针指向字符串的首地址,利用指针的后移可以指向后续字符。
字符指针指向字符串一般有三种的方法:
(1)为字符指针初始化字符串首地址
例:
char *p = "I am happy";
这时字符串常量 "I am happy" 在内存中占用11个字节,以上初始化过程是将这段存储空间的首地址赋给字符型指针p,我们称指针p指向字符串"I am happy",存储示意图如下所示:
例1:字符串指针变量。
#include <stdio.h>
void main()
{
char *string="I love China!";
printf("%s\n",string);
}
程序执行结果:
I love China!
Press any key to continue.
注意:
字符串指针变量的定义说明与指向字符变量的指针变量说明只能按对指针变量的赋值不同来区别。
例如:
char c,*p=&c;
表示p是一个指向字符变量c的指针变量。
而:
char *s="C Language";
则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。
(2)为字符指针赋值字符串首地址
例:
char *p;
p = "I am happy";
以上赋值语句“p = "I am happy";”是将字符串存储空间的首地址赋给指针p,然后p便指向字符串。注意不是将字符串赋给指针p。
(3)让指针指向存放字符串的数组
例:
char a[20] = "I am happy", *p = a;
以上定义了字符数组a并为之初始化字符串"I am happy",然后定义了字符指针p,将p初始化为指向数组a的首地址,即指向了字符串的第一个字符 'I'。
例2:输出字符串中n个字符后的所有字符。
#include <stdio.h>
void main()
{
char *ps="this is a book\n";
int n=10;
ps=ps+n;
printf("%s\n",ps);
}
程序执行结果:
book
Press any key to continue.
例3:在输入的字符串中查找有无‘k’字符。
#include <stdio.h>
void main()
{
char st[20],*ps;
int i;
printf("input a string:\n");
ps=st;
scanf("%s",ps);
for(i=0;ps[i]!='\0';i++)
if(ps[i]=='k')
{
printf("there is a 'k' in the string\n");
break;
}
if(ps[i]=='\0') printf("There is no 'k' in the string\n");
}
程序执行结果:
input a string:
abcjhykdfkhy
there is a 'k' in the string
Press any key to continue.
关于“指针操作字符串”的常见错误:
错误1:使用类型不正确的指针指向字符串
例:
float *p = "abcde";
分析:指针的类型决定了其所指存储单元的类型,字符串中的每个字符都是char型的,因此指向字符串的指针必须是char型的。
错误2:使用悬空的字符指针输入字符串
例:
char *p;
gets(p);
分析:以上定义的指针p未指向任何有效的存储空间,称为指针悬空,此时gets( )输入的字符串将无处存放,解决的办法是必须将p指向已分配的有效存储空间。