C/C++ : 类型限定符const

一、const介绍

关键字const是C/C++中的类型限定符(qualified type),以const关键字声明的对象,其值不能通过赋值或递增、递减来修改,但可以初始化const变量。

二、用法说明

先来看一个简单的例子:

#include <stdio.h>

int main(int argc, char **argv)
{
    const int a = 10;         // work (initialization)
    const int a; a = 10;      // not work (assignment)  

    return 0;
}

正如上面的注释所说的那样,第一行代码可以工作,因为它是对"const int"类型的变量"a"初始化;而第二行代码不工作,因为它先定义了一个"const int"类型的变量,然后对"a"赋值。

用关键字const修饰普通变量和数组相对简单和容易理解,当用来修饰指针时,要复杂一些,因为需要区分是限定指针本身为const还是限定指针指向的值为const,再来看下面的例子:

#include <stdio.h>

int main(int argc, char **argv)
{
    const char *a = NULL;    // *a is const, but a isn't
    a = argv[1];             // work (change a, not *a)
    *a = argv[1];            // not work (change *a, not a)

    return 0;
}

上面的例子中,const限定指针a所指向的值*a是不可变的,但指针a本身是可变的,可以随时指向其他的内存位置。

要想限定指针a本身不可变,将限定符const放在*的右侧即可,如下:

int * const a;     // a is const

此时,指针a本身的值不可变,a必须指向同一个地址,但是它所指向的值可以改变。

 

三、总结

用const来限定普通变量,其值不可变。

用const来限定指针,需要注意区分是限定指针本身为const还是限定指针指向的值为const。当const放在*左边任意位置,限定了指针指向的数据不能改变;当const放在*右边,限定了指针本身不能改变。

最后的这个例子和编译错误提示很好的总结了以上几点:


#include <stdio.h>

int main(int argc, char **argv)
{
    const int a = 10;
    const int b; b = 10;

    const int *pa = NULL;
    pa = &a;
    *pa = a;

    int *const pb;
    pb = &a;
    *pb = a;

    return 0;
}
error : assignment for read-only variable 'b'
    const int b; b = 10;
error : assignment for read-only variable '*pa'
    *pa = a;
error : assignment for read-only variable 'pb'
    pb = &a;

参考资料:

<<C Primer Plus>>(Sixth Edition), by Stephen Prata. P.403

 

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值