const关键字
1. 普通变量与const关键字
const修饰的变量称为const常量,
定义的时候必须要初始化,且作为常量,不能修改。
//const关键字修饰的变量称为常量
const int number1 = 10;
int const number2 = 20;
//error 常量必须要进行初始化
const int val;
除了这种方式可以创建常量外,还可以使用宏定义的方式创建常量:
const常量与宏定义的区别?
- 编译器处理方式不同。宏定义是在预处理阶段展开,做字符串的替换;而const常量是在编译时。
- 类型和安全检查不同。宏定义没有类型,不做任何类型检查;const常量有具体的类型,在编译期会执行类型检查。
在使用中,应尽量以const替换宏定义,可以减小犯错误的概率。
2. 指针与const关键字
-
const位于*左边的时候
(const*)
,称为常量指针(pointer to const),**特点:**不可以改变指针所指变量的值,可以改变指针的指向(本身)。
-
const位于*右边的时候
(*const)
,称为指针常量(const pointer),**特点:**可以改变指针所指变量的值,不可以改变指针的指向(本身)
-
双const:两个const修饰变量,
int value = 10;
int *p1 = &value;
*p1 = 11;
/* p1 = NULL; */
p1 = nullptr; //c++的空指针写法
//当const位于*左边的时候,称为常量指针(const*)(pointer to const)
//即const修饰的是*p整体;
//即*p3是常量,不能修改,即不能修改指针所指变量的值;
//但可以修改指针本身的值,即指针的指向。
cout << endl;
int value2 = 200;
const int *p2 = &value2;
cout << "*p2 = " << *p2 << endl;
/* *p2 = 222; //报错error */
p2 = &value; //ok
cout << "*p2 = " << *p2 << endl;
cout << endl;
int value3 = 300;
int const *p3 = &value3;
cout << "*p3 = " << *p3 << endl;
/* *p3 = 333;//报错error */
p3 = &value;//ok
cout << "*p3 = " << *p3 << endl;
//当const位于*右边的时候,称为指针常量(*const)(const pointer)
//即const修饰的是p4,
//即p4是常量,不可以修改指针本身的值p4,即指针的指向
//但可以修改指针所指变量的值:*p4
cout << endl;
int value4 = 400;
int * const p4 = &value4;
cout << "*p4 = " << *p4 << endl;
*p4 = 444 ;//ok,可以修改指针所指变量的值
/* p4 = &value;//error, p4本身不能被改变,不可以修改指针的指向(本身) */
cout << "*p4 = " << *p4 << endl;
//双const
cout << endl;
int value5 = 500;
const int * const p5 = &value5;
cout << "*p5 = " << *p5 << endl;
/* *p5 = 555 ;//error, 不可以修改指针所指变量的值 */
/* p5 = &value;//error, 不可以修改指针的指向(本身) */
cout << "*p4 = " << *p4 << endl;