const类型限定符

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36503007/article/details/80308270

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)。

扫描二维码关注公众号,回复: 3343398 查看本文章


但是如果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限定符来保护全局变量。

猜你喜欢

转载自blog.csdn.net/qq_36503007/article/details/80308270