为什么 operator== 对静态初始化的 char* 有效?

Why does operator== work for statically initialized char*?

当创建一个像这样的字符数组时:

char c_array1[] = { "str1" };
char c_array2[] = { "str1" };
char* cp_array1 = c_array1;
char* cp_array2 = c_array2;
if(cp_array1 == cp_array2) { // char* cannot be compared with char*

比较失败。但是使用静态初始化的 char*:

char* cp_array1 = "str1";
char* cp_array2 = "str1";
if(cp_array1 == cp_array2) { // char* can be compared with char*

有效。 在这种情况下,为什么 operator== 对相同类型的参数表现不同?

 // char* cannot be compared with char*

char*可以和char*

比较

The comparison does fail

程序没有理由无法比较指针。如果添加了缺少的部分,则显示的程序是合式的。指针将比较不相等,因为它们指向不同的对象。

char* cp_array1 = "str1";
char* cp_array2 = "str1";

这个程序格式错误。字符串文字不可转换为非常量 char* (C++11 起).

如果你解决了这个问题,那么指针可能比较相等,也可能不相等,这取决于编译器是否对单独的字符串文字使用了相同的数组(通常,编译器至少在它们出现在相同的翻译单元)。

"但是对于静态初始化的 char* 它有效" - 它 可能 有效 -如果编译器优化了您的代码以仅存储一个 str1(这是允许的)。

您正在比较指针 - 而不是它们指向的字符串。

如果要比较字符串,请使用std::strcmp:

if(std::strcmp(cp_array1, cp_array2)) {
    // not equal
} else {
    // equal
}

虽然字符串是 const,所以它应该是 const char* cp_array1 = "str1";const char* cp_array2 = "str1";