C语言--const和指针

const数组、const指针和指向const的指针。

const数组

#define MONTHS 12
...
const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};

如果程序稍后尝试改变数组元素的值,编译器将生成一个编译期错误消息:

days[9] = 44;   /* 编译错误 */

指向const的指针

指向const的指针不能用于改变值。考虑下面的代码:

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;   // pd指向数组的首元素

第2行代码把pd指向的double类型的值声明为const,这表明不能使用pd来更改它所指向的值:

*pd = 29.89;    // 不允许
pd[2] = 222.22;  //不允许
rates[0] = 99.99;  // 允许,因为rates未被const限定

无论是使用指针表示法还是数组表示法,都不允许使用pd修改它所指向数据的值。但是要注意,因为rates并未被声明为const,所以仍然可以通过rates修改元素的值。另外,可以让pd指向别处:

pd++; /* 让pd指向rates[1] -- 没问题 */

指向 const 的指针通常用于函数形参中,表明该函数不会使用指针改变数据。例如:

void show_array(const double *ar, int n);

关于指针赋值和const需要注意一些规则。
首先,把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的:

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];       //有效

然而,只能把非const数据的地址赋给普通指针:

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];    // 有效

这个规则非常合理。否则,通过指针就能改变const数组中的数据。

const指针

const还有其他的用法。例如,可以声明并初始化一个不能指向别处的指针,关键是const的位置:

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向数组的开始
pc = &rates[2];       // 不允许,因为该指针不能指向别处
*pc = 92.99;        // 没问题 -- 更改rates[0]的值

可以用这种指针修改它所指向的值,但是它只能指向初始化时设置的地址。

两次const

最后,在创建指针时还可以使用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;   //不允许
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值