模糊指针声明

时间:2010-09-21 21:21:17

标签: c++ c

我有一个问题,在某种程度上,我想,完全是微不足道的:那是什么(以及为什么)?

const float *(*const*)(int)

我的理解是它是一个“指向函数的常量指针,该函数将int作为参数并返回指向常量float的指针”。

这是对的吗?

如何“精神上解析”(*const*)?特别是因为没有名字,起初我不知道从哪里开始。我认为“名称”的唯一可能性就是这样:*const *name因为其他组合无效(如果我是正确的),那么“name是一个指向常量指针的指针...... ”

这种推理有效吗?

谢谢!

3 个答案:

答案 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