const限定符
在C90标准中新增的const关键字,用于限定一个变量为只读。这里注意,在C语言中,用const类型限定符声明的是变量,不是常量! 我们最初接触C语言时,会简单用const限定符将一个变量声明为只读,使其在程序中不可修改。
const int NUNBER=12;//NUMBER在程序中不可更改,值为12
在之后的学习中,我们会接触到指针,在数组和指针中,const限定符有着很重要的作用。
对形式参数使用const
在函数意图不是修改数组中的数据内容时,可以在函数原型和函数定义中声明形式参数时应使用const关键字,num()函数原型和定义如下:
int num(const int arr[],int n);//函数原型
int num(const int arr[],int n)//函数定义
{
int i;
int total=0;
for(i=0;i<n;i++)
total+=ar[i];
return total;
}
上面代码告诉编译器该函数不能修改数组arr[]指向的数组中的内容。const关键字会保护数组:
#define MONTHS 12
...
const int days[MONTHS]={31,28,31,30,31,30,31,31,30,31,30,31};
//如果后面出现修改days[]内的值,编译器将会报一条错误信息
days[3]=79;//编译错误
同时,在指针中,const的规则更严谨:
//指向const的指针不能改变值
int days[12]={31,28,28,30,31,30,31,31,30,31,30,31};
const int*pr=days;//pr指向days的首元素
//将不能使用pr改变它所指向的值
*pr=83;//不可以
pr[2]=46;//不可以
days[3]=31;//可以,因为days未被限定
pr++;//可以,指向days[1]
在指针赋值和const中需要注意一些规则,首先,把const数据或非const的数据的地址初始化为指向const的指针或为其赋值是合法的:
double rates[5]={88.99,100.12,59.45,56.47,200.56};
const lock[4]={0.08,0.075,0.03,0.002};
const double*pr=rates;//有效
pr=lock;//有效
pc=&rates[3];//有效
这里注意只能把非const的数组地址赋给普通指针
double rates[5]={88.99,100.12,59.45,56.47,200.56};
const lock[4]={0.08,0.075,0.03,0.002};
double * pr=rates;//有效
pr=lock;//无效
pr=&rates[3];//有效
这个规则的建立可以保证指针不会改变const数组中的数据。
熟悉上述规则后,观察下面代码段:
//显示数组内元素
void show_array(const double arr[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%8.3f",arr[i]);
putchar('\n');
}
//把数组内各个元素乘以相同值
void mult_array(double arr[],int n,double mult)
{
int i;
for(i=0;i<n;i++)
arr[i]*=mult;
}
//这里两个函数返回类型都为void。虽然mult_array()更新数组内地址,但未使用return机制
在show_array()函数中可以接受普通数组名和const数组名作为参数,这两种参数都可以用来初始化指向const的指针:
show_arrary(rates,5);//有效
show_arrary(lock,4);//有效
可以看出在形参中使用const不仅可以保护数据还可以让函数处理const数组;
但是不能把const数组名作为实参传递给mult_arrary()这种的函数:
mult_arrary(rates,5,1.2);//有效
mult_arrary(lock,4,1.2);//禁止这样做
在C标准中,使用非const标识符(如mult_arrary()的形参arr)修改const数据(如lock)导致的结果是未被定义的。
const还可以用来声明并初始化一个不能指向别处的指针,注意这里const的位置。
double rates[5]={88.99,100.12,59.45,56.47,200.56};
double *const pr=rates; //pr指向rates的首元素
pr=&rates[2]; //不允许,该指针不能指向别处
*pr=22.93; //可以--改rates[0]的值
pr++; //不允许
//只可以修改它初始化时指向的地址的值
还可以使用两次const,即该指针既不能修改它指向的地址,也不能修改指向地址上的值:
double rates[5]={88.99,100.12,59.45,56.47,200.56};
const double * const pr=rates[5];//pr指向rates[5],且不可被修改地址和上面的值
pr=&rates[3];//不被允许
*pr=22.93;//不被允许