(我知道这个很老了,但我还是想分享一下。)
我只是想详细解释一下Thomas Matthews的答案。C类型声明的右左规则基本上是这样说的:当阅读C类型声明时,从标识符开始,可以向右走就向右走,不能向右走就向左走。
这最好通过几个例子来解释:
示例1
const char* const foo
^^^^^
foo是一个常数......
向左继续
const char* const foo
^
foo是一个指向常量的指针...
向左继续
const char* const foo
^^^^
foo是一个指向字符类型的常量指针...
继续向左
const char* const foo
^^^^^
foo是指向常量字符常量的指针(完整!)
char* const foo
^^^^^
foo是一个常量...
向左继续
char* const foo
^
foo是一个指向常量的指针...
向左继续
char* const foo
^^^^
foo是一个指向char类型的常量指针(完整!)
示例1337
const char* const* (*foo[8])()
^^^
foo是一个包含8个元素的数组...
遇到括号时,如果不能继续向右移动,则向左移动
const char* const* (*foo[8])()
^
foo是一个包含8个指向的数组...
括号内的内容已完结,现在可以向右移动
const char* const* (*foo[8])()
^^
foo是一个包含8个指针的数组,这些指针指向返回函数的指针...
没有更多向右的内容,请向左走
const char* const* (*foo[8])()
^
foo是一个包含8个指向返回指向a的指针的函数指针的数组...
继续往左
const char* const* (*foo[8])()
^^^^^
foo是一个包含8个指向返回指向常量的函数的指针的数组...
继续向左
const char* const* (*foo[8])()
^
foo是一个包含8个指向函数的指针数组,这些函数返回一个指向常量指针的指针...
继续向左
const char* const* (*foo[8])()
^^^^
foo是一个包含8个指向返回指向char的常量指针函数的数组...
继续向左
const char* const* (*foo[8])()
^^^^^
foo是一个数组,它包含8个指向函数的指针,这些函数返回一个指向常量字符指针的指针。(完成!)
更多解释请参考:http://www.unixwiz.net/techtips/reading-cdecl.html