比较C中的两个char *和两个char []字符串

时间:2017-11-17 03:04:59

标签: c arrays string pointers

#include <stdio.h>

int main(){
    char a[] = "bar";
    char b[] = "bar";
    printf("%d\n", (a==b));

    char* x = "bar";
    char* y = "bar";
    printf("%d\n", (x==y));
 }  

输出:

0 
1

我知道我们不能使用==运算符来比较C char数组,因为它比较了内存​​位置,但为什么它在第二种情况下有效呢?

3 个答案:

答案 0 :(得分:5)

在第一种情况下,当您定义了两个数组时,编译器为它们分配了两个单独的存储,因此ab不相等。

但是,对于第二种情况,当您使用相同的字符串文字初始化两个指针时,编译器会发现它们是相同的字符串,并将两个指针指向同一个地址,该地址是该字符串文字的起始地址({{ 1}})。 然而,正如@David所说,这不是必然发生的,在某些情况下,删除一些优化,或基于某些编译器,"bar"x可能不是相同。

答案 1 :(得分:3)

输出有意义,因为数组的内存存储不相等。对于char,他们的文字字符进行比较。尝试运行此示例。

int main(void) {
    char a[] = "bar";
    char b[] = "bar";

    printf("Arrays Test: %x == %x ? %d\n",&a,&b,(a==b));


    char* x = "bar";
    char* y = "bar";

    printf("Literals Test: %x == %x ? %d, however x == y ? %d\n",&x,&y, (&x==&y),(x==y));

    return 0;
}

This online runnable example表明char的内存引用不一样。

如果您想查看阵列的内容是否相等,则需要调用阵列中的每个字符并手动将其与辅助阵列进行比较。通过相互检查数组的大小,可以更快地结束执行。

另一点是&#34;指针化&#34;字符或数组在这个比较范围内没有区别。

答案 2 :(得分:1)

这是依赖于实现的

在第一种情况下,ab具有单独的存储空间,因此它们的地址不相等。

但是,编译器可能会识别出xy指向的字符串是相同的,因此可以通过使它们指向同一位置进行优化,因为您无法对其进行修改。但是,由于标准不要求这样做,所以不能依赖于结果。这是一个可选的优化。编译器仍然可以生成两个相同的字符串,并使xy分别指向它们。