当我被指针指向数组和指针数组混淆时,我想到了这个问题,尽管我已经想出了如何区分它们,字面意思。
但是我仍然对编译器如何理解指针声明感到困惑。例如,有int*
这样的类型吗?
int *p; // a common pointer declaration
具体来说,编译器如何理解前一句话?首先将p
视为指针,然后找到指向的对象int
?或者发现用户声明了一个名为int*
的指针到p
的指针?
当面对数组指针时,对我来说更加困惑。
int (*p)[4] //a pointer to an array of int[4]
怎么理解这个?编译器是否将此视为int[4] *p
(int[4]
的工作方式类似于我们在容器中的新类型)?以下案例中的类似问题。
int *p[4] //an array-of-pointers
由于[]
在*
之前,编译器首先理解p[4]
并将p
视为数组(具有未知元素类型),然后将元素类型指定为int*
?
答案 0 :(得分:1)
声明的解析可以在当前标准的第6.7.6节中找到。它太大而无法完全覆盖,但简而言之,有关p
类型的规则是以归纳方式规定的。在这些规则中,T
是普通类型(没有指针/数组等),D
是声明符:
T * D
的定义是指D
中的T D
类型为&{34} / T
" ,然后D
的类型是"指向T
"的东西。
T D[N]
(其中N可以为空白或其他各种内容)定义为D
中T D
的类型为" T
",然后D
的类型是" N
"的数组(T
}的某些内容。 / p>
因此,您可以看到每个规则修改了规则的先前应用的结果,直到我们开始结束"结束"当D
是普通标识符时发生的归纳。
此外,T ( D )
表示T D
,而不是强制执行解析。
有些消息来源将声明描述为正在读取"内部取出"虽然这个感应链实际上发生在"在"之外,但你需要进入然后回溯你的结果。虽然最终结果是相同的,但我们可能被教导作为人类阅读的方式与语言定义不同。
使用您的一个示例int *p[4]
:
T * D
,T
= int
且D
= p[4]
。由于T D
将是" int"的数组[4] (见下文),然后T * D
是#34;指向int"的数组[4]。在此步骤中,我们分析了int q[4]
:
T D[N]
,T
= int
且D
= q
。这是"结束案例"因为D
是普通标识符,所以此步骤中q
的类型为int
""数组[4]。另一个例子是int (*p)[4]:
T D[N]
,其中T
= int
,D
= (*p)
。由于T D
将是指向int
"的指针,因此T D[4]
是"指向int
&#34的数组[4]的指针;