编译器如何理解指针和数组的声明

时间:2017-06-12 03:03:06

标签: c++ c pointers compiler-construction

当我被指针指向数组和指针数组混淆时,我想到了这个问题,尽管我已经想出了如何区分它们,字面意思。

但是我仍然对编译器如何理解指针声明感到困惑。例如,有int*这样的类型吗?

int *p;   // a common pointer declaration

具体来说,编译器如何理解前一句话?首先将p视为指针,然后找到指向的对象int?或者发现用户声明了一个名为int*的指针到p的指针?

当面对数组指针时,对我来说更加困惑。

int (*p)[4]   //a pointer to an array of int[4]

怎么理解这个?编译器是否将此视为int[4] *pint[4]的工作方式类似于我们在容器中的新类型)?以下案例中的类似问题。

int *p[4]    //an array-of-pointers

由于[]*之前,编译器首先理解p[4]并将p视为数组(具有未知元素类型),然后将元素类型指定为int*

1 个答案:

答案 0 :(得分:1)

声明的解析可以在当前标准的第6.7.6节中找到。它太大而无法完全覆盖,但简而言之,有关p类型的规则是以归纳方式规定的。在这些规则中,T是普通类型(没有指针/数组等),D是声明符:

  1. T * D的定义是指D中的T D类型为&{34} / T" ,然后D的类型是"指向T"的东西。

  2. T D[N](其中N可以为空白或其他各种内容)定义为DT D的类型为" T",然后D的类型是" N"的数组(T}的某些内容。 / p>

  3. 因此,您可以看到每个规则修改了规则的先前应用的结果,直到我们开始结束"结束"当D是普通标识符时发生的归纳。

    此外,T ( D )表示T D,而不是强制执行解析。

    有些消息来源将声明描述为正在读取"内部取出"虽然这个感应链实际上发生在"在"之外,但你需要进入然后回溯你的结果。虽然最终结果是相同的,但我们可能被教导作为人类阅读的方式与语言定义不同。

    使用您的一个示例int *p[4]

    • 规则1 - 其格式为T * DT = intD = p[4]。由于T D将是" int"的数组[4] (见下文),然后T * D是#34;指向int"的数组[4]。

    在此步骤中,我们分析了int q[4]

    • 规则2 - 其格式为T D[N]T = intD = q。这是"结束案例"因为D是普通标识符,所以此步骤中q的类型为int""数组[4]。

    另一个例子是int (*p)[4]:

    • 规则2 - 格式为T D[N],其中T = intD = (*p)。由于T D将是指向int"的指针,因此T D[4]是"指向int&#34的数组[4]的指针;