数组不是基本类型,不能直接参与比较,数组与字符串及字符指针与字符串比较其实比较的是二者的地址。
例:
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"比较的是地址!
首先,当你这么引用一个字符串的时候 "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:你要理解两个感念, 同一个东西 内容相同的两个东西
注:字符串比较用用strcmp()函数,strcmp(test,"char")及strcmp(temp,"char")!
转自: http://bbs.csdn.net/topics/300002842