本篇通过const 与指针的的关系,来谈谈c语言中const的称谓。
首先看看下列常常被举例说明const的经典语句 :
char ch,* const p = &ch;
char const * p;
const char * p;
第一句 const 是修饰p的,所以p被约定称为常量指针。
- 常量指针在定义时必须初始化。如果第一句写成:char ch,* const p; 然后再 p = &ch; 那就要出错了。
- 虽然指针p不能变,但它所指的内容则可以变,即*p = ‘d’; 是合法的。当然,p之前已经初始化,也不存在野指针的问题。
第二句和第三句完全相同,表示p所指内容通过p来更改不可以,即 *p = ‘d’错误。但p本身可以更改,即 p = &ch 没问题。
问题:很多文章都将这种情况的p称为指针常量,这种称呼或许是一种简称,或许是一种约定,但无论如何都是不恰当的。
因为这条语句是在说明p本身而不是p所指的内容是个什么性质的量,如果说其是指针常量,从中文的意思看p成了个常量,这显然不妥。
英文此时称之为 pointer to const(指向常量的指针),很清楚地表明:p是个指针,在这里它指向一个常量。
之所以强调在这里,还是为了说明p所指的内容通过p来更改是不可以的,但仍然可以通过其它方法改变(例如将赋值p时的右值再赋值给一个普通指针变量pp,诸如pp = &ch; *pp = ‘x’),这一点和用#define定义的常量明显不同,从这个意义上说,const被称为常量同样容易引起混乱,改称固定量似乎更容易区分。起码在用于指针时应该强调一下。
最后,为了更好地说明“固定量”const的用法,举一个有代表性的例子
int main(void){
char ar[]="great",*p, * const *pk;
p=ar;
pk=&p;
// *pk=p;//错误
**pk='w';
printf("%c\n",**pk);
return 0;
}
此例中可看出 pk、**pk均可变,唯独 *pk 不可变,这正体现了const 的作用。