1、const常量与符号常量
相比于通过#define定义的符号常量,使用const修饰符有两点优势:
1)const修饰符将变量转换为常量时,会做语法检查,如果存在越界或超限的情况,会给出警告,而#define宏定义只做简单替换;
如当我们需要定义一个short(2字节)常量时,使用:
#define AI 65535
const short AI = 65535;
下边表达式,编译器会给出越界警告,而上边表达式语法无误,自然不会有所提示。
2)const修饰的常量进行初始化时,会对赋值符右边的表达式进行求解,而#define宏定义只做简单替换,不会求解表达式。
#define SUM 5 + 5
const int SUM = 5 + 5;
同样执行 3 * SUM,上边输出20,下边输出30。
当然若这样说明#define SUM (5 + 5),则都输出30。这里仅在语法方面给出不同,至于怎么灵活运用,就看需求。
2、const修饰的变量并不是常量
1)const修饰变量
const int a = 10;
a = 20;
这时编译器会报错。
const int a = 10;
int *adder_a = &a;
*adder_a = 20;
此时a 的值变为20;
const修饰的变量,其值不可以直接被改变,但可通过指针被改变。
2)const修饰指针变量
int a = 1;
const int* adder = &a;
通过 const 修饰 int*,为指向常量的指针,指针的指向可以改变,而所指向的值不可以改变。
int a = 1;
int* const adder = &a;
通过 const 修饰 adder,指针的指向不可以改变,而所指向的值可以改变。
int a = 1;
const int* const adder = &a;
其指向和指向的内容均不可变。
读者可根据项目需要进行选用。
int main()
{
int a = 1;
const int *adder_a = &a;
//此时定义一个指向常量的指针
//*adder_a = 2;
int ** adder_adder_a = &adder_a;
**adder_adder_a = 2;
printf("%d",**adder_adder_a);
}
指向常量的指针亦可被指向指针的指针修改其指向的数据:
**adder_adder_a = 2;
输出为2;
而 //*adder_a = 2;
编译器会报错。