在指针和参量声明中使用const
在声明一个简单变量和数组时使用关键字const很简单。指针则要复杂一些,因为不得不把让指针本 身成为const与让指针指向的值成为const R分开来。下面的声明表明pf指向的值必须是不变的:
const float * pf: /* pf指向一个常景浮点数值*/
但pf本身的值可以改变。例如,它可以指向另一个const值。相反,下面的声明表明指针pt本身的值 不可以改变:
float * const pt; /* pt 是一个常量指针 */
它必须总是指向同一个地址,但所指向的值可以改变。最后,下面的声明:
const float * const ptr;
意味着ptr必须总是指向同一个位置,并且它所指位置存储的值也不能改变。
还有第三种放置const关键字的方法:
float const * pfc; // 等同于:const float. * pfc;
正如注释所表示的那样,把const放在类型名的后边和*的前边,意味着指针不能够用来改变它所指向 的值。总而言之,一个位于*左边任意位置的const使得数据成为常量,而一个位于*右边的const使得指针自身成为常量。
这个新关键字的一个常见用法是声明作为函数形式参量的指针。例如,假定一个名为display ()的函 数显示一个数组的内容。为了使用它,您可能会把数组名作为实际参数传送,但数组名是一个地址,这样 做将允许函数改变调用函数中的数据。下面的原型防止了这样的情况发生:
void display (const int array[]. int limit):
在函数原型和函数头部,参量声明const int array[]与const int * array相同,因此该声明表明array指向
的数据是不可变的。
ANSI C库遵循这一惯例。如果指针只是用来让函数访问值,将把它声明为const受限指针。如果指针 被用来改变调用函数中的数据,则不使用关键字const。例如,ANSIC中strcat ()声明如下:
char *strcat (char *,const char *):
回忆一下,函数strcat()在第一个字符串的末尾处添加第二个字符串的一份拷贝。这改变了第一个字 符串,但不改变第二个字符串。该声明也体现了这一点。