C-与字符串指针混淆


#include<stdio.h>
int main()
{
    switch(*(1+"AB" "CD"+1))
    {
        case 'A':printf("A is here");
            break;
        case 'B':printf("B is here");
            break;
        case 'C':printf("C is here");
            break;
        case 'D':printf("D is here");
            break;
    }
}

输出为:C在这里。

任何人都可以向我解释一下这让我感到困惑。

首先,仅由白空间(和注释)隔开的字符串文字被串联成单字符串。这发生在表达解析之前发生(例如,有关更多信息,请参见此翻译阶段参考)。这意味着表达式*(1+"AB" "CD"+1)确实被解析为*(1+"ABCD"+1)

要记住的第二件事是,诸如 "ABCD"之类的字符串文字确实是只读的 arrays ,因此,人们可以使用正常的数组折线,或者让它们衰减到指针到他们的第一个指针元素。

第三件事是,对于任何数组或指针p和索引i,表达式*(p + i)等于p[i]。这意味着*(1+"ABCD"+1)(与*("ABCD"+2)的确相同)与"ABCD"[2]相同。这为您提供了字符串中的第三个字符。字符串中的第三个字符是'C'

在C中,相邻字符串文字(例如"AB" "CD")被串联。(这是一种便利性,可以轻松地通过多行分解长字符串,并启用某些功能,例如<inttypes.h>中的PRIx64等宏。)结果是"ABCD"

字符串文字是字符的数组。在大多数情况下,数组会自动转换为指向其第一个元素的指针。(例外是您想要实际数组的上下文,例如应用sizeof。)因此,"ABCD"成为A字符的指针。

当将一个人添加到指针中(到数组中的元素)时,结果指向数组中的下一个元素。因此,1+"ABCD"指向B。和1+"ABCD"+1指向C

然后*操作员生产指针指向的对象,因此*(1+"ABCD"+1)C字符,其值为C

在这里,switch(*(1+"AB" "CD"+1))switch(*(2+"ABCD"))一样评估。* (2+"ABCD")指向字符C。这就是为什么您的代码输出为C is here

*(any thing)被评估为指向字符串文字的指针。

最新更新