const可以用在数据上,如:
const int limit = 10;
这和其他语言差不多,但当你在等式两边加上指针,就有一定难度了:const int * limitp = &limit ;
int i = 27;
limitp = &i;
这段代码表示limitp是一个指向常量整型的指针。这个指针不能用于修改这个整型数, 但是在任何时候,这个指针本身的值却可以改变。这样,它就指向了不同的地址,对它进行 解除引用(dereference)操作时会得到一个不同的值!
const和*的组合通常只用于在数组形式的参数中模拟传值调用。它声称“我给你一个指 向它的指但你不能修改它。”这个约定类似于极为常见的void *的用法,尽管在理论上 它可以用于任何情形,但通常被限制于把指针从一种类型转换为另一种类型。
类似地,你可以取一个const变量的地址,并且可以...(唔,我最好不要往大家的脑 袋里灌输这种思想)。正如Ken Thompson所指出的那样,“const关键字可能引发一些 罕见的错误,只会混淆函数库的接口。”回首往事,const关键字原先如果命名为readonly 就好多了。
C语言的声明所存在的最大问题是你无法以一种人们所习惯的自然方式从左向右阅读-一 个声明,在ANSI C引入volatile和const关键字后,情况就更糟糕了。由于这些关键字只能 出现在声明中(而不是使用中),这就使得现今声明形式和使用形式能完全对得上号的例子越 来越少了。那些从风格上看像是声明,但却没有标识符的东西(如形式参数声明和强制类型 转换)看上去显得滑稽。如果想要把什么东西的类型强制转换为指向数组的指针,就不得不 使用下面的语句来表示这个强制类型转换:
char (*j) [20] ; /* :i是一个指向数组的指针,数组内有20个char元素。
j = (char (”[20]) malloc(20);
如果把星号两边看上去明显多余的括号拿掉,代码会变成非法的。
涉及指针和const的声明可能会出现几种不同的顺序:
const int * grape;
int const * grape;
int * const grape_jelly;
在最后一种情况下,r旨针是只读的,而在另外两种情况下,指针所指向的对象是只读的。 当然对象和指针有可能都是只读的,下面两种声明方法都能做到这一点:
const int * const grape_jam;
int const * const grape_jam;