const关键字
用来定义常量constant
常量是不能被赋值的,即不能充当左值。
命名常量/符号常量Named Constant
等号右边的部分也是常量叫做字面常量Literal Constant
常量在声明的同时就要赋值,之后都不可修改,即常量不可变。
指针
指针是一个地址
下面是一个 常量指针常量 / 常指针常量 的例子:
const x = 5;
const int* const p = &x;
表示p只能指向x的地址,x的值只能是5.
不能通过解引用改变x的值,也不能让p指向其他地址。
const int x = 1, x2 = 2, * p1;
p1 = &x;
p1 = &x2;
p1是常量指针,可以重复赋值,但不能通过解引用修改指向的量的值,即 “ *p1 = 2; ” 是错误的。
指向常量值的是一个指针变量,称为常量指针/常指针。
指针所指向的内容不能通过指针的解引用(*p)修改。
指向变量的指针则称为变量指针。
常量指针所指向的数据内容不可变。
列子:
//常量指针/常指针
const int x = 1;
const int* p1;
p1 = &x;
p1 = nullptr;
//*p1 = 10;是错误的
const char* str1 = "hello";
其中 *p1是常量,*str1是常量,p1是变量,str1是变量。
字符串"hello"是一个字面常量,作右值时相当于把一个地址赋给str1,所以适用于对const限制的指针赋初值。
指向变量的一个不可变的指针,称为指针常量。
指针本身的内容是个常量,本身不可以改变,所指内容可以改变,即可以通过解引用改变所指内容的值。
数组名就是一个指针常量。
例子:
//指针常量
int x = 1;
int* const p2 = &x;
*p2 = 0;
其中 p2是常量,*p2是变量,可以通过*p2给x重新赋值。
应用auto类型:
const int x = 1;
auto p1 = &x; //const int *p1
auto p2 = "1234ohmygod??"; //const char *p2
auto const p3 = "ohmygod!!"; //const char *const p3