为了读取复杂的指针声明,有左右规则 https://web.archive.org/web/20110818081319/http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html.
但这条规则没有提到如何阅读const
修饰符。
例如在一个简单的指针声明中,const
可以通过多种方式应用:
char *buffer; // non-const pointer to non-const memory
const char *buffer; // non-const pointer to const memory
char const *buffer; // equivalent to previous declartion
char * const buffer = {0}; // const pointer to non-const memory
char * buffer const = {0}; // error
const char * const buffer = {0}; // const pointer to const memory
现在如何使用const
用指针声明的指针?
char **x; // no const;
const char **x;
char * const *x;
char * * const x;
const char * const * x;
const char * * const x;
const char * const * const x;
阅读这些声明的简单规则是什么?
哪些声明有意义?
Is the 顺时针/螺旋规则 http://c-faq.com/decl/spiral.anderson.html适用的?
两个现实世界的例子
方法ASTUnit::LoadFromCommandLine http://clang.llvm.org/doxygen/classclang_1_1ASTUnit.html#ab18e63a754071c368a0afccbec0de8a8 uses const char **
提供命令行参数(在 llvm clang 源中)。
的自变量向量参数getopt() http://linux.die.net/man/3/getopt声明如下:
int getopt(int argc, char * const argv[], const char *optstring);
Where char * const argv[]
相当于char * const * argv
在这种情况下。
由于这两个函数使用相同的概念(指向字符串的指针向量来提供参数)并且声明不同 - 明显的问题是:为什么它们不同?一个比另一个更有意义吗?
意图应该是:const
修饰符应指定该函数不操作该向量的字符串,也不改变向量的结构。