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

char数组 、char指针与字符串常量的比较,结果不一样!为什么?
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"的比较结果不一样呢?

------解决方案--------------------
t == "char"比较的是地址
------解决方案--------------------
int isequiv(char *t) 

if (t == "char") 
return 1; 
else 
return 0; 


字符串的比较不能直接==,得用strcmp或strncmp吧???
------解决方案--------------------
探讨
char *temp = "char";
temp 与 isequiv中的"char"常量地址是相同的?

------解决方案--------------------
我把代码稍微改了一下,发现结果没变...解释就是char* temp = "char";出现的字符串字面值存储在Global常量区,而且如果有其他的指针指向同样的字面值,将指向同一个字符串..
C/C++ code

#include <stdio.h>

int isequiv(char *t) 
{ 
    char* chr = "char";
    if (t == chr) 
        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; 
}

------解决方案--------------------
函数里的t=="char"是进行指针的比较,temp是指针,指向"char"这个字符串常量的内存首地址,所以和"char"进行指针比较是相等的
而test是在栈里分配的字符数组的首地址,和"char"的地址不同,所以不相等
------解决方案--------------------
这要看你想比较什么了?

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

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

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

如果想比较字符串的内容,那就不能用t=="char"这样的比较了,应该使用strcmp函数来做比较。

------解决方案--------------------
C/C++ code

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:你要理解两个感念,

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