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

Ahm*_*man 3 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));
 }  
Run Code Online (Sandbox Code Playgroud)

输出:

0 
1
Run Code Online (Sandbox Code Playgroud)

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

OmG*_*OmG 5

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

但是,对于第二种情况,当您使用相同的字符串文字初始化两个指针时,编译器会发现它们是相同的字符串,并将两个指针指向同一个地址,该地址是该字符串文字的起始地址("bar"). 然而,作为@大卫说,这不一定发生,并且在某些情况下,删除了一些优化,或基于一些编译器,x并且y可能是不一样的.