一、字符串的表示形式
在 C++中,我们可以用两种方式访问字符串。
(1)用字符数组存放一个字符串,然后输出该字符串。
int main()
{
char str[]="I love china! ";
printf("%s\n",str);
}
(2)用
字符指针指向一个字符串。
可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。
int main()
{
char *str="I love china! ";
printf("%s\n",str);
}
在这里,我们没有定义字符数组,而是在程序中定义了
一个字符指针变量 str,用字符串常量"I love China!",对它进行
初始化。C++对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来才存放该字符串常量。对字符指针变量初始化,实际上是把字符串
第 1 个元素的地址(即存放字符串的字符数组的首元素地址)赋给 str。有人认为 str 是一个字符串变量,以为在定义时把"I love China!"这几个字符赋给该字符串变量,这是不对的。
char *str="I love china! ";
等价于
char *str;//定义一个指针变量
str="I love china! ";//把I的地址赋值给指针变量str
//指针变量只能存放地址
可以看到,str 被定义为一个指针变量,指向字符型数据,请注意它只是指向了 一个字符变量或其他字符类型数据,不能同时指向多个字符数据,更不是把"I love China!"这些字符存放到 str 中 (指针变量只能存放地址)。只是把"I love China!"的第一个字符的地址赋给指针变量 str。
输出时,使用:
printf("%s\n",str);
其中“%s”是输出
字符串时所用的格式符,在输出项中给出字符指针变量名,则系统先输出它所指向的一个字符数据,然后
自动是 str 加 1,使之指向下一个字符,然后再输出一个字符……如此知道遇到字符串结束标志“\0”为止。
注意:可以通过字符数组名或者字符指针变量输出一个字符串。而对一个数值型数组,是不能企图用数组名输出它的全部元素的。
例如:
int i[10];
……
printf(”%d\n”, i);
这样是不行的,只能逐个输出。显然 %s 可以对一个字符串进行整体的输入和输出。
二、字符串指针作函数参数
将一个字符串从一个函数传递到另外一个函数,可以用地址传递的方法,即用字符数组名作参数或用指向字符的指针变量做参数。在被调用的函数中可以改变字符串内容,在主调函数中可以得到改变了的字符串。
【例 8】输入一个长度最大为 100 的字符串,以字符数组的方式储存,再将字符串倒序储存,输出倒序储存后的字符串。(这里以字符指针为函数参数)
//! anihc evol I
#include<cstdio>
#include<cstring>
using namespace std;
void swapp(char &a,char &b)//交换两个字符的位置
{
char t;
t=a;
a=b;
b=t;
}
void work(char* str)
{
int len=strlen(str);
for(int i=0;i<len/2;i++) swapp(str[i],str[len-i-1]);
}
int main()
{
char s[110];
char *str=s;
gets(s);
work(str);
printf("%s",s);
return 0;
}