为什么char *和char **具有相同的值?

时间:2019-01-16 20:34:56

标签: c pointers

我写了这段简单的代码, 所以我不明白为什么**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;
}

3 个答案:

答案 0 :(得分:5)

您的代码中没有**str1 and **str2。我猜您在问为什么这是真实的if (*str1 == *str2)?该代码测试str1str2指向的字符。由于在两种情况下都是'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)中,*“删除”了间接寻址,结果是字符本身(不是指针的指针)