当我们比较C中的字符串时,我们会小心地使用strcmp
(或其其他变体(来进行相等性检查。例如,如果一个字符串是char hello1[7] = "hello!"
,另一个字符串为char hello2[7] = "hello!"
,我们可以使用strcmp
检查它们的内容是否相等。然而,我们不能使用==
,因为==
会比较每个数组的第一个元素的地址(由于数组衰减(,而这总是错误的。
那么,为什么当我尝试比较两个char *
和==
时,结果是真的呢?例如:
int main() {
char *str1 = "Hello";
char *str2 = "Hello";
if (str1 == str2) {
printf("equaln");
} else {
printf("not equaln");
}
}
这将打印equal
。根据我的理解,指针本质上是一个地址,因此char *
是包含字符的位置的地址。那么,这里的两个地址怎么可能相同呢?
因为这两个地址相同。您的编译器在程序中包含了字符串"Hello"的一个副本,并使str1
和str2
都指向它
C标准规定,字符串文字可能是内存中不同的数组,也可能不是,如果为了让编译器能够做到这一点而修改它们,则可能会发生未定义的事情。