C++ const修饰符和指针
开发工具与关键技术:C++、VisualStudio
作者:何任贤
撰写时间:2019年04月10日
const修饰符,是用来修饰变量,被const修饰符,修饰过的变量,就叫做常量,常量是一种只能被读取,不能被修改的量。在C++声明一个常量时,不但要const修饰符还有在声明时就要给它进行初始化,你不给它初始化,编译器就会报错,不给const修饰符就不是常量,下面是对常量只读属性和声明的示例
void main()
{
const int a = 10;
a = 15;
}
当你尝试给常量赋值时,编译器会报错,并且给你提示,意思是表达式必须是可以修改的左值,证明了常量是不可以修改的,那么你不给常量初始化编译器又会报什么错呢?
我们可以看到当我不给常量赋值时,编译器报错,并提示常量a需要初始值设定项,证明了常量必须进行初始化操作。
那么我们用const修饰符修饰指针呢?又有什么样的效果?指针和普通变量不同指针存储的是地址,那么const修饰符对指针修饰产生的效果有三种。我们先说第一种。
先看代码和结果我们再说第一种
void main()
{
int x = 10;
const int *a;
a = &x;
cout << “a所指向的地址:” << a << “\n”
<< “a的解地址” << *a << “\n”;
}
通过结果和代码我们可以知道被const修饰符这样修饰的指针还是可以获得地址和解地址的,那么可以改变解地址后的值吗?因为指针是可以通过地址修改值的,那么让const修饰过还行吗?
这个错误和上面的是一样的,我们现在可以知道,const这样修饰的话,会使指针无法通过解地址修改x的值,这是第一种的效果,我们称它为指向常量的指针,那么第二种
我们发现第二种有两个错误,和之前的一样,意思这个指针要进行初始化,该初始化是固定不可修改的。
void main()
{
int x = 10; int *const a= &x;
*a = 15;
cout << *a << “\n”;
}
我们可以知道的是,这样修饰的指针是可以正常的对解地址的值进行赋值的,那么我们一般称它为常量指针
那么第三种呢则是这两种的结合体,不但不可以对解地址赋值,还不能改变指针所指向的地址,而且还必须进行初始化,反正就是什么都不能动,但是我们可以正常的读取值,这种结合了第一第二种特性,那么它名字也是结合的就是指向常量的常量指针,这就是const修饰符对指针修饰的三种不同的效果。