当我们在用C/C++写代码时,想让某个变量为常量,将变量定义时添加const关键字修改即可。关键字const的应用如下:
1.const修饰变量
const type name = value;
//等价于如下,const放在数据类型的前后均可。
type const name = value;
//示例
const int num = 100; //表示num为一个不可改变的常量
num = 90;//重写给num赋值,将会发生编译错误,原因是const修饰的变量是不可以再修改其值。
从上面可以看出,常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。
2.const与指针
const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据。
const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。
const int *p1; //指针所指向的数据是只读的,也就是 p1、p2 本身的值可以修改(指向不同的数据),但它们指向的数据不能被修改。
int const *p2; //与上一行的定义等价
int * const p3; //指针是只读的,也就是 p3 本身的值不能被修改
const int * const p4; //指针本身和它指向的数据都有可能是只读的
int const * const p5; //等价上一行。
3.const 和函数形参
const 通常用在函数形参中,如果形参是一个指针,为了防止在函数内部修改指针指向的数据,就可以用 const 来限制。
4.const 和非 const 类型转换
const char *和char *是不同的类型,不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的,编译器允许将char *类型的数据赋值给const char *类型的变量。
5.C和C++中的const区别
const int m = 10;
int n = m;
(1)数据取值的原理不同
在C语言中,编译器会先到 m 所在的内存取出一份数据,再将这份数据赋给 n;而在C++中,编译器会直接将 10 赋给 n,没有读取内存的过程,和int n = 10;的效果一样。C++ 中的常量更类似于#define命令,是一个值替换的过程,只不过#define是在预处理阶段替换,而常量是在编译阶段替换。
C++ 对 const 的处理少了读取内存的过程,优点是提高了程序执行效率,缺点是不能反映内存的变化,一旦 const 变量被修改,C++ 就不能取得最新的值。
#include <stdio.h>
int main(){
const int n = 10;
int *p = (int*)&n; //必须强制类型转换
*p = 99; //修改const变量的值
printf("%d\n", n);
return 0;
}
C打印的结果是99,而C++则是10;原因是C++不会从内存中读数。
(2)作用域不同
C和C++中全局 const 变量的作用域相同,都是当前文件。
不同的是它们的可见范围:
C语言中 const 全局变量的可见范围是整个程序,在其他文件中使用 extern 声明后就可以使用;
而C++中 const 全局变量的可见范围仅限于当前文件,在其他文件中不可见,所以它可以定义在头文件中,多次引入后也不会出错。