如何取消引用字符串文字?

How can a string literal be dereferenced?

以下代码将字符 S 与字符串文字的第一个元素进行比较 "Stack",

根据我的理解,只能取消引用指针,但是这个字符串文字像指针一样工作?

#include <stdio.h>
int main() {
    if('S'==*"Stack")
        printf("equal");
}

“String literal”是源代码中的一个事物的名称,就像“keyword”是源代码中intswitch这样的关键字的名称。

当源代码中出现字符串文字时,会创建一个字符数组,并用字符串文字的字符以及终止空字符 (C 2018 6.4.5 6) 填充。

当数组在表达式中使用时,除了作为 sizeof 的操作数、一元 & 的操作数,或作为用于初始化其他数组的字符串文字,它是自动转换为指向其第一个元素的指针 (C 2018 6.3.2.1 3)。

因此,当"Stack"出现在源代码中时,它会导致指向“S”的指针,因此*"Stack"是一个char,其值为“S”。

类似地,"Stack"[1] 是一个 char,其值为“t”。

在 C 中,字符串文字是一个 数组,因为 C 中的字符串是字符数组。

在 C 语言中,当数组出现在表达式中时,几乎毫无例外地,您得到的(用于计算该表达式的数组“值”)是 指向数组的指针第一个元素.

所以如果你说

int a[10];
*a = 7;

,这与 a[0] = 7 所做的完全相同。而且,完成后,您可以通过说 if(*a == 7).

来测试它

情况与您发布的示例 100% 相似。字符串文字 "Stack" 是一个数组,因此当您在表达式中使用它时,它的有效值是指向其第一个元素的指针。

展开内容以查看“隐藏”的内部步骤,它的工作原理与您编写的内容相同

char stringliteral[] = "Stack";        /* the string literal is actually an array */
char *temporary_pointer;
temporary_pointer = &stringliteral[0]; /* we implicitly get a pointer to the array's first element */
if('S' == *temporary_pointer)
    ...

附录:这个事实的另一个证明,即字符串文字实际上是一个数组,如果您正在编写代码将数字转换为其字符串表示形式,则会突然出现。任何整数到字符串的算法都不可避免地以计算必须转换为相应字符的数字值告终。如果您使用的基数为 10 或更少,则只需添加一个偏移量即可将数字转换为字符:dig + '0'。但另一种方式,适用于例如十六进制数也是 "0123456789abcdef"[dig].