如何解码指针+数组的复杂声明?
虽然几乎所有的时候我都用std::vector
,但我很想尽可能多地了解指针。我正在谈论的示例:如何解码指针+数组的复杂声明?
char* array[5]; // What does it mean?
// 1) pointer to an array of 5 elements!
// 2) an array of 5 pointers?
我对此声明的确切定义感兴趣。
不只是指针和数组:How to interpret complex C/C++ declarations:
开始读取来自 最里面括号中的声明,向右走,并 然后向左走。当你遇到 的括号时,方向应该是 颠倒过来。一旦所有的 圆括号都被解析出来,跳出它的 。继续,直到整个 声明已被解析。
一个小改动,右左 规则:当你开始阅读 声明,第一次,你 必须从标识符开始, 不是最里面的括号。
您例如:
char* array[5];
是5个指针数组为char。
char *是类型,并且您有5个数组。
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)
链接到网站:http://www.cdecl.org/ – Casebash 2010-09-09 11:48:20
我从一些杂志的一篇文章了解到顺时针/螺旋规则很久以前。下面是介绍该技术的在线文章:
它使我受益匪浅,但我还是有些怪异基于模板的声明我有时遇到的境地斗争。
您总是阅读从右向左解释'*'作为指针的指针。 例如字符**一个[5]是5个指针数组的字符指针...
在C/C++读取类型的一般过程是:
- 确定最终的类型,它可以是基本类型或typedef标识符,并且可以具有类型修饰符,如const,volatile等。在您的示例中,它是“char”。
- 将运算符与优先级相同的顺序应用到标识符中,正如它们在表达式中的一样。这些运算符可以是*(取消引用),[](索引)和()(调用函数)。
在语法的原始哲学中,您的示例应该写成“char * array [5]”,标识符是“数组”,操作符是[](索引),然后是*(取消引用)。
该声明然后读取为合同“如果您按顺序应用这些运算符,那么您将得到最终类型的对象”。
在你的情况下,完整的句子是“如果你索引变量”数组“,然后解引用结果表达式,你会得到一个字符”。
你也可以认为它像“如果你的索引变量‘阵列
’,那么你如果取消引用它,你就会得到一个char得到一个对象,说:”关键是大多保持跟踪[]和()的优先级高于*。您可以像使用正则表达式一样使用括号来控制操作符的顺序。
谢谢,好文章:) – AraK 2009-10-01 00:15:11