【发布时间】:2009-10-01 00:08:18
【问题描述】:
虽然我几乎一直使用std::vector,但我有兴趣尽可能多地了解指针。我所说的例子:
char* array[5]; // What does it mean?
// 1) pointer to an array of 5 elements!
// 2) an array of 5 pointers?
我对这个声明的准确定义感兴趣。
【问题讨论】:
虽然我几乎一直使用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 的指针组成的数组。
【讨论】:
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 )
【讨论】:
我很久以前从一些杂志文章中学到了顺时针/螺旋规则。这是描述该技术的在线文章:
它对我很有帮助,尽管我仍然在为我有时遇到的一些可怕的基于模板的声明而苦苦挣扎。
【讨论】:
在 C/C++ 中读取类型的一般过程是:
在语法的原始哲学中,您的示例应该写成“char *array[5]”,标识符是“array”,运算符是 [](索引)然后是 *(取消引用)。
然后声明读起来就像一个合同“如果您按该顺序应用这些运算符,那么您将获得最终类型的对象”。
在你的情况下,完整的句子是“如果你索引变量“数组”,然后取消引用结果表达式,你会得到一个字符。
你也可以这样认为“如果你索引变量“数组”,那么你会得到一个对象,如果你取消引用它,你会得到一个字符”
诀窍主要是跟踪 [] 和 () 的优先级高于 * 的事实。您可以像正则表达式一样使用括号控制运算符顺序。
【讨论】:
char * 是类型,你有一个由 5 个组成的数组。
【讨论】:
[] 的优先级高于 *,这就是为什么它是一个指针数组而不是相反的原因。
【讨论】:
您总是从右到左读取指针,将“*”解释为指针。 例如 char** a[5] 是一个由 5 个指向字符指针的指针组成的数组...
【讨论】: