深入const限定符

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;//不被允许
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值