2009-10-01 56 views
3

虽然几乎所有的时候我都用std::vector,但我很想尽可能多地了解指针。我正在谈论的示例:如何解码指针+数组的复杂声明?

char* array[5]; // What does it mean? 
// 1) pointer to an array of 5 elements! 
// 2) an array of 5 pointers? 

我对此声明的确切定义感兴趣。

回答

3

不只是指针和数组:How to interpret complex C/C++ declarations

开始读取来自 最里面括号中的声明,向右走,并 然后向左走。当你遇到 的括号时,方向应该是 颠倒过来。一旦所有的 圆括号都被解析出来,跳出它的 。继续,直到整个 声明已被解析。

一个小改动,右左 规则:当你开始阅读 声明,第一次,你 必须从标识符开始, 不是最里面的括号。

您例如:

char* array[5]; 

是5个指针数组为char。

+0

谢谢,好文章:) – AraK 2009-10-01 00:15:11

1

char *是类型,并且您有5个数组。

3

cdecl是一个非常适合这种事情的程序。 (特别是当你添加函数指针混进去!)

Type `help' or `?' for help 
cdecl> explain char* foo[5] 
declare foo as array 5 of pointer to char 
cdecl> declare bar as array 5 of pointer to function (integer, integer) returning char 
char (*bar[5])(int , int) 
+0

链接到网站:http://www.cdecl.org/ – Casebash 2010-09-09 11:48:20

2

我从一些杂志的一篇文章了解到顺时针/螺旋规则很久以前。下面是介绍该技术的在线文章:

它使我受益匪浅,但我还是有些怪异基于模板的声明我有时遇到的境地斗争。

1

[]比*有更高的优先级,这就是为什么它是一个指针数组,而不是相反。

+0

哪一个具有更高的优先级,[]或()? – qed 2014-01-27 13:10:43

1

您总是阅读从右向左解释'*'作为指针的指针。 例如字符**一个[5]是5个指针数组的字符指针...

2

在C/C++读取类型的一般过程是:

  1. 确定最终的类型,它可以是基本类型或typedef标识符,并且可以具有类型修饰符,如const,volatile等。在您的示例中,它是“char”。
  2. 将运算符与优先级相同的顺序应用到标识符中,正如它们在表达式中的一样。这些运算符可以是*(取消引用),[](索引)和()(调用函数)。

在语法的原始哲学中,您的示例应该写成“char * array [5]”,标识符是“数组”,操作符是[](索引),然后是*(取消引用)。

该声明然后读取为合同“如果您按顺序应用这些运算符,那么您将得到最终类型的对象”。

在你的情况下,完整的句子是“如果你索引变量”数组“,然后解引用结果表达式,你会得到一个字符”。

你也可以认为它像“如果你的索引变量‘阵列

’,那么你如果取消引用它,你就会得到一个char得到一个对象,说:”关键是大多保持跟踪[]和()的优先级高于*。您可以像使用正则表达式一样使用括号来控制操作符的顺序。

+0

哪一个具有更高的优先级,[]或()? – qed 2013-11-04 20:35:23

+0

这是迄今为止我发现的最清晰的解释。 – qed 2013-11-04 20:38:17