const char *pa;
char const *pb;
上面两种定义方法一样都是 pa(pb)指向的变量的值不可改变,及*pa,*pb, 而pa,和pb本身是可变的,如:
pa = &ca; //ok
×pa = 'c' //error
char * const pc = &ca;
pc本身是不可变的(只能在定义时初始化),但指向的变量值是可变的,如
pc = &ca; //error
*pc = 'd'; //ok
const char * const pd = &cb;
pd本身是不可变的,且指向的变量也是不可变的(只能在定义时初始化)
pd = &cb; //error
*pd = 'c'; /error
通过以上总结,无论怎样定义p都是一指针
如果const在*左边,表示该指针指向的变量是不可变的
如果const在*右边,表示该指针本身是不可变得
const char **p
p[i]的值可变,而p[i][j]的值不可变。
对于
char * const *p
p[i]的值不可变,而p[i][j]的值可变。
对于
const char * const *p
p[i]的值不可变,p[i][j]的值也不可变。
由是可见,第三种对于接收参数的一方而言,是最为严厉的限制。在设计接口时,这类限制有助于减少程序中的潜在问题,但却会使使用现有接口的一些程序出现错误。许多公开的标准,特别是POSIX,往往会出于这种考虑而选择char * const *。在设计程序时,对于这种char * const*,应当作const char * const *看待,而不应abuse其p[i][j]可写的特性。