我正在尝试比较两个Char指针:
char * x;
char * y;
x = "Hesham";
y = "Hesham";
printf("%d %d \n", &x, &y);
if(x==y)
{
printf("=\n");
}
else
{
printf("!=\n");
}
执行结果是:
2293368 2293360
=
1 - 为什么两个指针有不同的收件人且操作==
返回true?
2 - 为什么编译器只存储字符串文字Hesham
一次,并且对x
和y
使用其地址两次?
答案 0 :(得分:11)
为什么两个指针的地址不同,操作
==
返回true?
&x
和&y
是指针变量的地址,而不是字符串的地址。由于x
和y
是不同的变量,因此它们具有不同的地址。
然后比较恰好相同的x
和y
的值,因为编译器已注意到两个字符串文字具有相同的值,并且只存储了文字的单个副本。
为什么编译器只存储字符串文字
"Hesham"
一次并将其地址用于x
和y
两次?
确实如此。这就是x == y
评估为真的原因。
要做的另一点是,在打印指针时应使用%p
格式说明符。
答案 1 :(得分:2)
依赖于编译器选项,编译器是将相等的字符串文字存储为单独的文字还是作为一个文字/通常默认编译器将相等的字符串文字存储为一个字符串文字,以最小化内存使用。
在这些陈述中
x = "Hesham";
y = "Hesham";
将字符串文字的第一个字符的相同地址分配给变量x和y。由于编译器将这两个字符串文字存储为一个字符串文字,因此显而易见的是,x == y
为x和y分配了相同的值。
但是,如果您设置编译器选项以强制编译器将相等的字符串文字存储为单独的文字,则表达式x == y
的结果将等于false
。
如果要比较必须编写的字符串文字
if ( strcmp( x, y ) == 0 ) { /*...*/ }
答案 2 :(得分:1)
根据Bjarne Stroustrup的 The C ++ Programming Language ,他说
Whether two identical string literals are allocated as one array or as two is implementation-defined.
我认为它也适用于C,因为C ++基于C99 。在您的情况下,只分配了其中一个并使用了两次,这意味着x
和y
指向相同的字符串。