与字符串指针混淆

时间:2017-12-07 14:21:43

标签: c pointers switch-statement

#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就在这里。

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

3 个答案:

答案 0 :(得分:11)

首先,仅由空格(和注释)分隔的字符串文字连接成单个字符串。这在表达式解析之前发生(有关更多信息,请参阅例如this translation phase reference)。这意味着表达式*(1+"AB" "CD"+1)实际上被解析为*(1+"ABCD"+1)

要记住的第二件事是像"ABCD"这样的字符串文字实际上是只读的数组,因此可以使用普通的数组索引,或让它们衰减到指向他们的第一个元素。

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

答案 1 :(得分:6)

在C中,连接相邻的字符串文字,例如"AB" "CD"。 (这是一种方便,允许在多行上轻松分解长字符串,并使某些功能(如PRIx64中的<inttypes.h>等宏)能够正常工作。)结果为"ABCD"。< / p>

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

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

然后*运算符生成指针指向的对象,因此*(1+"ABCD"+1)C字符,其值为C

答案 2 :(得分:2)

此处,switch(*(1+"AB" "CD"+1))的评估方式与switch(*(2+"ABCD"))类似。 * (2+"ABCD")指向字符C。这就是您的代码输出为C is here的原因。

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