我有一个问题,在某种程度上,我想,完全是微不足道的:那是什么(以及为什么)?
const float *(*const*)(int)
我的理解是它是一个“指向函数的常量指针,该函数将int作为参数并返回指向常量float的指针”。
这是对的吗?
如何“精神上解析”(*const*)
?特别是因为没有名字,起初我不知道从哪里开始。我认为“名称”的唯一可能性就是这样:*const *name
因为其他组合无效(如果我是正确的),那么“name是一个指向常量指针的指针...... ”
这种推理有效吗?
谢谢!
答案 0 :(得分:12)
你的名字在*const*
之后是正确的。如果你在cdecl.org中插入行const float *(*const* name)(int)
,它会告诉你它意味着“声明name为指向const指针的指针(int)返回指向const float的指针”
至于心理解析,我只记得R (*p)(A)
是指向函数的指针。因此R (**p)(A)
是指向函数指针的指针,此时所需要的只是记住const
和*
的交互方式。
答案 1 :(得分:6)
是的,推理是有效的。将它放在所有'*'的右边,这些'*'不在函数参数列表中,而在所有[]'es的左边,不在函数参数列表中。那你有
const float *(*const* name)(int)
然后像往常一样阅读。从那以及如何找到名称的正确位置,there are许多教程如何在互联网上解析它。
对于C ++,您可能需要查看geordi。
< litb> geordi: -c int name;
< geordi> Success
< litb> geordi: make name a const float *(*const*)(int) and show
< geordi> -c float const *(*const* name)(int) ;
< litb> geordi: << TYPE_DESC(const float *(*const*)(int))
< geordi> pointer to a constant pointer to a function taking an integer
and returning a pointer to a constant float
然后,您可以对其语法进行分析
< litb> geordi: show parameter-declaration and first decl-specifier-seq
< geordi> `int` and `float const`.
< litb> geordi: make name an array of 2 pointer to function taking int and
returning pointer to float and show
< geordi> -c float const *(* name[2])(int );
它可以让你将C与英语混合
< litb> geordi: make name an array of 2 pointer to (float const*(int)) and show
< geordi> -c const float *(* name[2])(int);
如你所见,它非常强大。
答案 2 :(得分:2)
从外面工作。
你有以下形式:
U D(V)
所以你有类似的功能。
某事 - 某事是一个功能int
并返回const float*
。
对于(*const*)
,你向后工作以使const
在正确的位置(虽然对称,这在这里甚至不重要!)。 *const*
〜“指向const指针的指针”,就像int * const * p
p
中的(说)一样,指针指向const
的{{1}}指针。 / p>
全部放在一起:指向const指针的指针指向函数int
并返回int
。