C 中指向 char 的指针数组

Array of pointers to char in C

我对指向 char 的指针数组在 C 中的工作方式感到困惑。

这是我用来理解指向 char 的指针数组的代码示例。

int main() {
    char *d[]={"hi","bye"};
    int a;
    a = (d[0]=="hi") ? 1:0;
    printf("%d\n",a);
    return 0;
}

我得到 a = 1 所以 d[0]="hi"。令我困惑的是,由于 d 是一个字符指针数组,不应该 a[0] 等于 hi 字符串的 h 的地址?

C 2018 6.4.5 指定了字符串文字的行为。第 6 段指定源代码中的字符串文字会导致创建字符数组。当数组用于表达式而不是 sizeof 的操作数、一元 & 的操作数或用作初始化数组的字符串文字时,它会自动转换为指向其数组的指针第一个字符。所以char *d[]={"hi","bye"};初始化d[0]d[1]指向"hi""bye"的第一个字符,而d[0]=="hi"比较d[0]指向另一个 "hi".

的第一个字符的指针

第 7 段说相同的数组可用于相同的字符串文字:

It is unspecified whether these arrays are distinct provided their elements have the appropriate values…

因此,当您的编译器获取 d[0]=="hi""hi" 的第一个元素的地址时,它可能(但不是必须)为 "hi" 使用相同的内存就像在 char *d[]={"hi","bye"};.

中初始化 d[0] 时所做的那样

(请注意,该段落还允许将相同的内存用于与其他字符串文字末尾的子字符串相同的字符串文字。例如,"phi""hi" 可以共享内存.)