#include <iostream>
int main() {
char* a = "test";
char b[] = "test";
if ( a == "test" ) // work
std::cout << "1";
if ( b == "test" ) // don't
std::cout << "2";
}
两种变体究竟发生了什么?只是memmory地址比较?
答案 0 :(得分:5)
在这两种情况下,您都没有比较实际的字符串(使用strcmp
),但地址:
a
中存储的地址(字符串文字的起始地址"test"
)与(概念上)不同字符串文字,恰好具有相同的内容。但是,如果代码中存在多个相同的字符串文字,则允许编译器将它们全部存储在同一位置以节省内存,因此,比较结果为true(尽管不保证每次都会发生这种情况)。 / LI>
b
的第一个元素的地址与字符串文字的地址进行比较。这里,b
是一个本地数组,其中包含字符串"test"
的副本,但位于完全不同的内存区域,因此此比较失败(并且始终会失败)注意:除非你有充分的理由不这样做,否则当然 - 正如PaulEvans所提到的 - 使用std::string
而不是char数组来存储字符串。这将为您提供所有优秀的语义属性和您期望的运算符重载。
答案 1 :(得分:2)
在这两种情况下,你都要比较指针而不是字符串,所以它们的任何一个工作都是瞎眼的。
比较字符串的最佳方法是使用std::string
。类似的东西:
std::string c = "test";
if (c == "test")
std::cout << "c really is \"test\"!\n";