将char数组和指向char字符串的指针与char字符串进行比较

时间:2016-04-03 08:38:47

标签: c++

#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地址比较?

2 个答案:

答案 0 :(得分:5)

在这两种情况下,您都没有比较实际的字符串(使用strcmp),但地址:

  1. 在第一种情况下,您要将a中存储的地址(字符串文字的起始地址"test")与(概念上)不同字符串文字,恰好具有相同的内容。但是,如果代码中存在多个相同的字符串文字,则允许编译器将它们全部存储在同一位置以节省内存,因此,比较结果为true(尽管不保证每次都会发生这种情况)。 / LI>
  2. 但是,在第二种情况下,您将b的第一个元素的地址与字符串文字的地址进行比较。这里,b是一个本地数组,其中包含字符串"test"的副本,但位于完全不同的内存区域,因此此比较失败(并且始终会失败)
  3. 注意:除非你有充分的理由不这样做,否则当然 - 正如PaulEvans所提到的 - 使用std::string而不是char数组来存储字符串。这将为您提供所有优秀的语义属性和您期望的运算符重载。

答案 1 :(得分:2)

在这两种情况下,你都要比较指针而不是字符串,所以它们的任何一个工作都是瞎眼的。

比较字符串的最佳方法是使用std::string。类似的东西:

std::string c = "test";

if (c == "test") 
    std::cout << "c really is \"test\"!\n";