const的高级用法
本文主要展示constant数组、constant指针和指向constants的指针的用法。
const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
days[9] = 44;
/*编译出错 */ //指向常量的指针不能用于改变指向的数据的值,具体可以参考下面的代码 :
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;
// pd points to beginning of the array/*
上面代码的第二行将pd指针指向的对象为const类型,这意味着你不能**使用pd指针**来改变pd所指向的对象的值:
*/
*pd = 29.89;
// 不允许
pd[2] = 222.22;
// 不允许
rates[0] = 99.99;
// 允许,因为rates数组不是const类型//在上面的例子中,不管使用指针标记法(*pointer)还是数组标记(pointer[i]),
//你都不能使用指针pd改变所指向内容的值。但是,rates没有被声明//为const,
//所以你仍然可以使用rates来改变数值。当然,你可以让pd指向其它位置:pd++;
/*使pd指向rates[1],允许*//*指向常量的指针用作函数的形参时,表明函数不打算用指针改变数据。例如,
函数*/void show_array(const double ar[], int n);
/*可以声明为这样的形式*/:void show_array(const double *ar, int n);
/*
可以将非常量数据或者常量数据的地址赋给指向常量的指针:
*/
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
const double * pc = rates;
// 合法
pc = locked;
// 合法
pc = &rates[3];
//合法/*然而只有非常量的数据的地址可以赋给普通的指针:*/
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double locked[4] = {0.08, 0.075, 0.0725, 0.07};
double * pnc = rates;
// 合法
pnc = locked;
// 不合法
pnc = &rates[3];
// 合法/*函数show_array()可以接收普通的数组或者常数组作为实参,因为二者的地址都可以赋给指向常量的指针:*/
show_array(rates, 5);
// 合法
show_array(locked, 4);
// 合法/*
因此,使用在函数声明时使用const不仅可以保护数据,还允许函数接收常数组。像下面的函数
mult_array()不能接收常数组的地址:
*/
mult_array(rates, 5, 1.2);
// 合法
mult_array(locked, 4, 1.2);
// 不合法
【const的高级用法】show_array()原型为
void show_array(const double ar[], int n);
或者
void show_array(const double*, int );
mult_array()函数原型为
void mult_array(double ar[], int n, double mult);
函数原型可以参考数组形参文章
下面是关于const的更多用法,比如,声明和初始化指针时使指针只能指向一个地方,而声明方式有点戏剧性,只是和const的位置和上面例子中的不一样:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates;
// pc指向数组的首地址
pc = &rates[2];
// 不合法,pc不能指向其它地方
*pc = 92.99;
// 合法,pc的值不能变但是指向的对象的值能变
这样的指针依然可以改变指向的对象的值,但是它只能指向最初被赋予的位置。
如果你希望指针值和指针指向的值不变,你可以使用两个const:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * const pc = rates;
`
pc = &rates[2];
// 不允许
*pc = 92.99;
// 不允许
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量