### 常量

在现实生活中，有一些数据是不能被改变的。例如圆周率 π 的值为“3.1415926…”。在旧版本的 C 语言中，为了描述类似这样的数据，使用宏定义来实现。例如：

#define PI 3.1415926 //定义一个宏

使用宏定义的缺点是在预处理时不能够进行类型检查，并且不能够获得 PI 的地址。在标准 C 语言和 C++语言中引入了常量的概念。

常量，顾名思义，其值在运行时是不能改变的，但是在定义常量时可以设置初始值。在 C++中，可以使用 const 关键字来定义一个常量。

例如，下面的代码定义了一个 MAX_VALUE 的常量。

const int MAX_VALUE = 100;

对于常量，编译器会将其放置在一个只读的内存区域，其值不能被修改，但是可以应用在各种表达式中。如果用户试图修改常量，编译器将提示错误。

使用常量的最大好处是灵活。当程序中有多处需要使用一个常数值时，可以使用常量代替。当需要改动常数值时，只需要改动常量的值就可以了。此外，在定义函数时，如果在函数体中不需要修改参数值，建议将参数的类型定义为常量，这样，当用户不小心在函数体内修改了参数值，编译器将提示错误信息。

提示：以下内容是扩展内容，初学人员可以掠过。

使用 const 定义的常量，在应用程序的一些外在因素下是可以改变常量值的。例如，通过硬件设备或一些不合理的操作。const 限定符只是“欺骗了” 编译器，在出现为常量赋值的语句时，提示编译错误。但它并不能欺骗 CPU 或操作系统。观察下面的代码：

const int MAX_VALUE = 10;

*(int*)&MAX_VALUE = 5;

printf("%d/n",MAX_VALUE);

在上面的代码中，语句“*(int*)&MAX_VALUE = 5;”间接的修改了常量 MAX_VALUE 的值。执行一下代码，如图 1 所示。

图 1 常量

从图 1 中，可以发现常量的值仍然为 10，而不是预期的 5，难道常量的值没有发生改变？其实是编译器“做的怪”，当编译器扫描源文件时，会将常量 MAX_VALUE 出现的地方替换为 10，这样导致上述代码输出的结果仍然为 10。下面对上述代码稍作改动，如下：

const int MAX_VALUE = 10;

*(int*)&MAX_VALUE = 5;

int var = *(int*)&MAX_VALUE;

printf("%d\n",var);

执行代码，效果如图 2 所示。

图 2 修改常量

从图 2 中可以发现，常量 MAX_VALUE 的值改变了。