如何在C指针中确定优先级?


14

我遇到了两个难以理解的指针声明。我对优先规则的理解是这样的:

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

但是即使这样,我似乎也无法弄清楚如何正确评估以下示例:

第一个例子

float * (* (*ptr)(int))(double **,char c)

我的评价:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

然后,

  1. double **
  2. char c

第二个例子

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

应该如何阅读它们?


1
在这里询问关于语言如何处理其功能的问题。

Answers:


7

我对第一个猜测是:ptr是指向以int作为参数的函数的指针,并返回指向以double和char的指针作为参数并返回float的指针作为参数的函数的指针。

释义

(* ptr)(int)

说ptr是指向以int作为参数的函数的指针。为了发现该函数返回的结果,我们需要扩展视图:

(*(* ptr)(int))

这意味着该函数返回指向另一个函数的指针。该其他函数的参数为​​:

(双**,字符c)

它返回

浮动*

对于第二个:ptr是指向由五个指针组成的数组的指针,这些指针指向以char常量指针和int指针为参数的函数,返回无符号int指针的指针。

释义

(*(* ptr)[5])

将ptr声明为一个指向包含函数的五个指针的数组的指针

(char const *,int *)

作为参数并返回

未签名**


7

您可以尝试使用“顺时针旋转”方法来理解这些疯狂的声明:

http://c-faq.com/decl/spiral.anderson.html

我也在这里写过博客:

http://www.kalekold.net/index.php?post=4


感谢您的回复。但是在我的案例中,从顺时针旋转方法开始是什么?在链接上给出的示例中,有一些简单的示例。我无法将方程式与该方法匹配。
trapaank 2011年

1
您应该从标识符开始:ptr。您将拥有:“ ptr是指向采用int的函数的指针,并返回指向采用double和char的指针并返回浮点数的指针的函数的指针”。尝试spyral,您将获得相同的效果。
Remo.D

1

这是一个函数指针。编写它的人可以更好地使用typedef来使其更清晰。

实际上,它是使用这些参数起作用的指针。float * myfunc(double **,char)


4
我敢打赌,写这本书的人是老师。
mouviciel

希望它不是老师,因为您不需要了解这种胡扯。尽管我想一个好的老师会先用这样的表情拍你的脸,让你挠头试图解释它们,然后向你展示如何正确使用typedef。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.