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的值被更改。
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限定符来保护全局变量。