指针声明 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 D
将 D
中的标识符声明为某种派生自 T
的类型。可能没有添加任何东西; int foo
声明 foo
为 int
。或者声明符 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
中,有一些标识符,称为 ident。 D
可以只是 <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
”的指针。
带回限定词,最后一句告诉我们指定位置的任何限定词(const
、restrict
、volatile
、and/or _Atomic
在 *
和 D
之间),适用于 ident.
有人可以向我解释一下 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 D
将 D
中的标识符声明为某种派生自 T
的类型。可能没有添加任何东西; int foo
声明 foo
为 int
。或者声明符 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
中,有一些标识符,称为 ident。 D
可以只是 <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
”的指针。
带回限定词,最后一句告诉我们指定位置的任何限定词(const
、restrict
、volatile
、and/or _Atomic
在 *
和 D
之间),适用于 ident.