我写了这段简单的代码,
所以我不明白为什么**str1
和**str2
是相同的?
代码
#include <stdlib.h>
#include <stdio.h>
int main() {
char *str1 = "Hey, you";
char *str2 = malloc(11);
strcpy(str2, "Hey! You");
if (*str1 == *str2) {
printf ("HoHoHo!");
}
return 0;
}
答案 0 :(得分:5)
您的代码中没有**str1 and **str2
。我猜您在问为什么这是真实的if (*str1 == *str2)
?该代码测试str1
和str2
指向的字符。由于在两种情况下都是'H'
,因此表达式的计算结果为true。
如果要比较C样式的字符串,请使用strcmp
,如果两个字符串相等,则返回零。
if (strcmp(str1, str2) == 0)
{
printf ("HoHoHo!");
}
答案 1 :(得分:4)
str1
指向“嘿,你”。
str2
指向“嘿!你”
*str1
是该地址的char
。这实际上是字符串的第一个字母:“ H”。 str2的首字母也是'H'。因此(*str1 == *str2)
是一个真实的表达式,因为('H'=='H')
比较两个字符串:
strcmp(str1, str2)
-如果内容相同,则返回0,否则返回非零。
答案 2 :(得分:1)
符号前的*
意味着声明和函数体中的内容完全不同。
int *x;
-声明指向int
对象的指针
y = *x;
-*
取消引用指针x
,这与声明中的含义相反。它在声明中添加了一层,因此它去除了间接的一层。
我认为这是您感到困惑的原因。
在您的示例if (*str1 == *str2)
中,*
“删除”了间接寻址,结果是字符本身(不是指针的指针)