const类型限定符

const限定符

const关键字用于限定一个变量为只读,即其值不能通过赋值、递增、递减等操作来修改。(但允许初始化)

如:

----------------------------------------
const int X;
X = 0;//编译器报错,该操作不被允许
-----------------------------------------
const int X = 0;//初始化操作被允许

-----------------------------------------


指针与const

const int * p = &x;  //指针变量p可指向不同的地址,
                                  但地址所对应的值必须是int类型且只读的
------------------------------------------------------------------------
int * const p = &x;  //指针变量p指向的地址不能改变,
                                  但地址所对应的值是int类型且可变的
------------------------------------------------------------------------
const int * const p = &x;  //指针变量p指向的地址不能改变,
                                            而且地址所对应的值必须是int类型且只读的
------------------------------------------------------------------------

int const * p = &x; //和第一种的情况是等价的

------------------------------------------------------------------------


综上可以概括为:
const在‘*’左侧时,限定了(地址所对应的)内容不可变;

const在‘*’右侧时,限定了指针本身(即该指针所指的地址)不可变。



函数的形参与const

函数是不能改变参数列表中实参变量的值的,比如:


令变量num作为ADD()的实参后,输出的num并没有改变(有人会误认为num会变成了1)。


但是如果ADD()做如下的改变,结果就不一样了:


当参数为一个数组时,函数能令实参数组num的值被更改。


实际上,int a [ ]等价于int * a,也就是说此时ADD()的第一个参数是一个指针。

ADD()函数通过指针num改变了地址所对应的数值,其过程如下图:



这种情况很容易被忽略,所以我们往往用const来限定函数的指针形参(包括数组)所指的内容:


此时编译器就会报错(注意:const int a[ ]等价于const int * a,所以限定的是地址所对应的内容只读),起到了一定意义上对数组数据的保护作用。


#define与const

用#define定义一个常量和用const定义一个只读变量的效果经常会看起来很像:

#define PI 3.1415926

const float pi = 3.1415926;

当然肯定是不同,

1、#define只是在预处理时将代码中的每个PI部分一模一样展开,PI并不是一个变量,不需要有类型;

      const float是定义了一个变量,编译时会检查类型。

2、#define定义的常量是可以用#undef来取消定义的,然后再为PI重新定义一个内容。

3、当用#define定义时是不会分配内存的;

      而变量在定义时被分配了内存。

(。。。等等)

在定义全局变量时,因为全局变量被“暴露在外”,很容易被修改,在需要的时候会用const限定符来保护全局变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值