指针声明 C 标准

Pointer declaration C Standard

有人可以向我解释一下 C 标准中的以下引用吗?无论我多么努力地理解这一点,我都做不到,即使有人在 C 方面有经验,也应该理解这一点?

C 2018 6.7.6.1 1 说:

If, in the declaration “T D1”, D1 has the form

    * type-qualifier-listopt D

and the type specified for ident in the declaration “T D” is “derived-declarator-type-list T”, then the type specified for ident is “derived-declarator-type-list type-qualifier-list pointer to T”. For each type qualifier in the list, ident is a so-qualified pointer.

首先考虑 T DD 中的标识符声明为某种派生自 T 的类型。可能没有添加任何东西; int foo 声明 fooint。或者声明符 D 可能包含方括号 […] 以便添加“array of”,或者可能包含圆括号以便添加“function returning”,或者它可能包含星号以便添加“pointer to ”,或者它可能有这些的组合(包括可能的重复)。询问的文本说插入 * 使 T D 进入 T *D 通过在其他派生部分之后和 T 之前插入“指针”来更改声明。例如,将 int foo(void) 更改为 int *foo(void) 会将类型从“函数返回 int” 更改为“函数返回指向 int 的指针”。

这里有更详细的分析。

暂时忽略限定符,子句“如果在声明'T D1'中,D1具有* type-qualifier-listopt D”告诉我们考虑使用 T *D.

形式的声明

下一个子句,“并且在声明'T D'中为ident指定的类型是'derived -declarator-type-list T',”告诉我们考虑没有 *T *D 会是什么,就好像它只是T D。现在,在 D 中,有一些标识符,称为 identD 可以只是 <i>ident</i>,也可以是数组声明符,例如 <i>ident</i>[3],或函数声明符,<i>ident</i>(void),或另一个指针声明符,*<i>ident</i>,或这些的组合,包括重复。不管它是什么,T D 声明 ident 是某种东西。假设它声明 ident 的类型为“derived-stuff T”。

那句话的最后一个子句,“那么为 ident 指定的类型是 'derived-declarator-type-list type-qualifier-list 指针指向 T'”,告诉我们如果 T D 声明 ident为“derived-stuff T”类型,然后 T *D 声明 ident 为“derived-stuff指向T”的指针。

带回限定词,最后一句告诉我们指定位置的任何限定词(constrestrictvolatile、and/or _Atomic*D 之间),适用于 ident.