Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较C中的两个char*和两个char[]字符串_C_Arrays_String_Pointers - Fatal编程技术网

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

比较C中的两个char*和两个char[]字符串,c,arrays,string,pointers,C,Arrays,String,Pointers,我知道我们不能使用==操作符比较C字符数组,因为它比较内存位置,但为什么它在第二种情况下工作?在第一种情况下,正如您定义的两个数组,编译器为它们分配了两个单独的存储,因此a和b不相等 但是,对于第二种情况,当您使用相同的字符串文本初始化两个指针时,编译器发现它们是相同的字符串,并将两个指针指向相同的地址,该地址是该字符串文本的起始地址(“bar”)。 然而,正如@David所说,这不一定会发生,在某些情况下,删除一些优化,或者基于某些编译器,x和y可能不一样 这取决于实现 在第一种情况下,a和b

我知道我们不能使用
==
操作符比较C字符数组,因为它比较内存位置,但为什么它在第二种情况下工作?

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

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

这取决于实现

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


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

由于数组的内存存储不相等,因此输出是有意义的。对于字符,比较它们的文字字符。试着运行这个例子

0 
1
显示字符的内存引用不相同

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


另外一点是,“指针化”字符或数组在这个比较范围内没有区别。

在第一种情况下,它可以工作,因为编译器将两个
“bar”
字符串文本识别为相同的,并决定通过共享存储来节省空间,并且让
a
b
都指向它。我不知道为什么它在
x
y
的情况下不这样做,但是,你应该指出,
x
y
没有指向同一地址的要求。我很快就找到了那个“条”指向同一内存位置。@BennettYeo请在我的帖子中使用粗体。这不是未定义的行为,因为
x
y
都包含有效地址;依赖于实现。@DavidBowling去获取一些参考。什么参考?指针
x
y
定义良好,无论编译器为它们存储一个或两个字符串,指针比较都是有效的。没有。如果这能让你安心,你可以查看一下,发现它们中没有列出这一点;)
0 
1
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;
}