char数组 、char指针与字符串常量的比较,结果不一样!为什么?

romanticlife 2009-01-03 08:40:46
int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1
return 0;
}

为什么test与temp同"char"的比较结果不一样呢?
...全文
2981 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wnz1984 2012-09-27
  • 打赏
  • 举报
回复
你们在为一个错误的东西进行所谓的解释
deadxing 2011-03-16
  • 打赏
  • 举报
回复
学习了,这就是指针和数组的一大区别呀,要从编译器的角度看。。
ljt3969636 2009-07-21
  • 打赏
  • 举报
回复
mark一下
帅得不敢出门 2009-01-04
  • 打赏
  • 举报
回复
比较的是地址.
所以会这样.
char test[] = "char"; 在栈区 可以创建N份 地址自然不一样
char *temp = "char"; 在常量区 一个程序只要维护一份 地址就一样了.

romanticlife 2009-01-04
  • 打赏
  • 举报
回复
谢谢大家!
xzdwfwt111 2009-01-04
  • 打赏
  • 举报
回复
函数里的t=="char"是进行指针的比较,temp是指针,指向"char"这个字符串常量的内存首地址,所以和"char"进行指针比较是相等的
而test是在栈里分配的字符数组的首地址,和"char"的地址不同,所以不相等
wyswyg63 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 romanticlife 的帖子:]
int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}
[/Quote]
LZ可以看看 c与指针 3.1.3 字符串常量那部分(pdf P56) 。
"char" 是字符串常量,字符串常量的直接值是一个地址而不是字符串本身。
所以这里(t == "char") 比较是比较地址
char test[] = "char"; //这里的test是数组地址,分配在栈上,肯定不会与字符串常量地址相同
char *temp = "char"; //这里temp就是指向字符串常量的地址,所以相同。
zjf30366 2009-01-04
  • 打赏
  • 举报
回复
char test[] = "char";
char *temp = "char";
这两者分配得地址不同。
if (t == "char") 就是对地址得比较,所以会不同。
要比较字符串一定要用strcmp();
合金猫 2009-01-04
  • 打赏
  • 举报
回复
up
waizqfor 2009-01-03
  • 打赏
  • 举报
回复
星羽讲得很细致啊
对内存又有深的了解了 mark
ljmscsq 2009-01-03
  • 打赏
  • 举报
回复
lz这个地方t == "char") 用错了。==不能用来比较两个char*字符串相等。
int isequiv(char *t)
{
if (strcmp(t,"char")==0)
return 1;
else
return 0;
}
当然你也可以自己写个函数比较每一位大小,注意字符串以\0结束。
星羽 2009-01-03
  • 打赏
  • 举报
回复

int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

int main()
{
char test[] = "char";
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1
return 0;
}


首先,当你这么引用一个字符串的时候 "char",它表示存储在程序的常量区的一串字符串,它返回的就是这个常量区的字符串地址
比如假设这个地址是 0x004038b0 "char",那么当你使用 char *temp = "char";的时候,temp就得到了这个常量字符串的地址
,也就是temp等于 0x004038b0

或许你可以试试

char* p1 = "char";
char* p2 = "char";
char* p3 = "char";
char* p4 = "char";

这里的 p1 p2 p3 p4 的值都一样,都是指向常量区字符串 "char", 比如上面的 0x004038b0

然而当你这么只用的时候

char test[] = "char";

这里情况就和上面的不一样了,这样写的时候,编译器并不是让test也指向常量区的字符串"char"
而是,在本地堆栈分配了一段和"char"一样大的空间,如何把常量区字符串"char" 拷贝到test

可以这么理解
char* p1 = "char"; p1 和 常量区的"char"是同一个东西,地址相同
char test[] = "char"; test和 常量区的"char"不是同一个东西,但是内容相同




int isequiv(char *t)
{
if (t == "char")
return 1;
else
return 0;
}

以上面为例子

当你这么比较的时候 if (t == "char")
编译器是去比较t和"char"是不是同一个东西,它们的值(字符串的地址)是不是一样,而不是比较它们的内容是不是一样

由前面的讲解可以知道
char* p1 = "char"; p1 和"char"的值是一样的
char test[] = "char"; test 和 "char"的值不一样,只是它们指向的字符串内容一样而已


要比较两个字符串的内容是不是一样,用 strcmp()返回0就是一样

比如,你那个函数可以改为


int isequiv(char *t)
{
if (strcmp(t, "char") == 0)
return 1;
else
return 0;
}




ps:你要理解两个感念,

同一个东西
内容相同的两个东西

funnybunny 2009-01-03
  • 打赏
  • 举报
回复
果然这个问题对于每个语言都是个问题...建议各大版主把它永久置顶...
呵呵~貌似JAVA区对这个字符串问题搞得最火热啊!
elmnd 2009-01-03
  • 打赏
  • 举报
回复
上面的都讲得差不多了。。。
俺补充一句。想if (t == "char") 这样用的话,直接用STRING吧。。。
bitwwzhang130 2009-01-03
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 chenzhiyubuaa 的回复:]
以char* temp = “xxxxx”这样的字符串实际上是指针
printf("%d", isequiv(temp));输出 1 实际上不是必须的
有的编译器会把相同的字符串放到同一个地方,但不是必须的

而test是数组,他有自己的存储空间,所以地址和temp的地址不一样
所以printf("%d", isequiv(test));输出 0是必须的

[/Quote]
学习了
chenzhiyubuaa 2009-01-03
  • 打赏
  • 举报
回复
以char* temp = “xxxxx”这样的字符串实际上是指针
printf("%d", isequiv(temp));输出 1 实际上不是必须的
有的编译器会把相同的字符串放到同一个地方,但不是必须的

而test是数组,他有自己的存储空间,所以地址和temp的地址不一样
所以printf("%d", isequiv(test));输出 0是必须的
jieao111 2009-01-03
  • 打赏
  • 举报
回复
up jill
lann64 2009-01-03
  • 打赏
  • 举报
回复
这要看你想比较什么了?

1、char test[]="char";//定义了一个字符数组,数组内容被初始化成"char"
char* temp="char"; //定义一个指针,指向常量字符串"char"

2、if (t == "char") // 比较t和常量字符串的地址是否相同。

好的编译器,会把相同的常量字符串仅仅存一份拷贝,各个指针都指向这个拷贝。所以楼主的程序使用temp做实参时会得到比较相等(返回1)。
但这也是建立在编译器会把相同的常量字符串存放一份拷贝的基础上的。要是编译器存放多份拷贝,这里比较也可能不同。
对于test来说,这个不是常量字符串,存放地址肯定跟常量字符串“char”是不一样的,比较结果不同是可预期的。

如果想比较字符串的内容,那就不能用t=="char"这样的比较了,应该使用strcmp函数来做比较。
rejoice914 2009-01-03
  • 打赏
  • 举报
回复
上面都讲了

int isequiv(char *t)
{
if (t == "char") 地址跟字符串能比较吗?
return 1;
else
return 0;
}

int main()
{
char test[] = "char";//数组名作为函数参数传递时,就是传递地址的!
char *temp = "char";
printf("%d", isequiv(test));//输出 0
printf("%d", isequiv(temp));//输出 1 这里能比较成功是因为常量折叠吗?
return 0;
}
piginthetree 2009-01-03
  • 打赏
  • 举报
回复
if (t == "char") //比较t的值和"char"常量字符串的的首地址,temp里面存储的是"char"的首地址,所以return 1,而test传进去的是其数组的首地址,所以return 0.
加载更多回复(7)

69,394

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧