C关于字符串操作
先看一段代码
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] ="apple";
char str2[] ="apple";
char *p1 ="apple";
char *p2 ="apple";
printf("str1:%d\nstr2:%d\n",str1,str2);
printf("p1:%d\np2:%d\n",p1,p2);
return0;
}
猜猜看,str1 和str2相等吗?P1和p2相等吗?
想好了吗?看看下面输出结果:
哈哈,跟你想的一样吗?
要是不一样了,为什么会有这样的结果啊。
那我们来分析分析!
首先
char str1[] = "apple";
char str2[] = "apple";
str1和str2都是字符串数组,
回忆一下
Str1 和str2 代表什么呢?
Str1 和 str2都是指向数组首元素首地址.也就是str1[0]和str2[0]的首地址
Str1[0]和str2[0]分别占用不同的内存单元,当然不一样啦。
再看
char *p1 = "apple";
char *p2 = "apple";
p1 和 p2 代表什么呢?
P1和p2都是指针,指向字符常量区,这里放着”apple”,因为p1和p2都指向了这个
放在常量区的字符串,都代表这个字符串的首地址,当然一样啦,还有一点要注意,
常量区的在字符串是不能修改的。
接下来要说明一点!你可曾下过类似的语句吗
if(str1 ==str2)
或者
If(p1 == p2)
这样写正确吗?
根据上面的分析,我们来看看str1 和str2比较的目的是看这两个字符数组存的
字符串相同不相同,而if(str1 == str2)这样写比较的是地址,显然不相同。所以
需要使用strcmp(str1,str2)来比较.
那么If(p1 == p2)这句话对吗?嗯,这样是对的,因为如果他们都指向同一个字符串,
地址肯定相等,否则不同。