const基础与一级指针,二级指针,引用的结合
const基础:
在之前学习C语言的时候,我们就写过const,现在学习了C++,发现之前对于const的理解有些偏差,不够深刻。今天,我们就深入探索一下在C语言和C++下const的区别。
一:const在C和C++中的区别
①:在C语言中,被const修饰的内容称作常变量。它本质是一个变量,因此,C语言中const修饰的变量并不能作为初始化数组长度的下标。
其特点只有一个:被修饰的内容不可以作为左值存在。
②:而在C++中,const修饰的内容叫做常量,在编译阶段会被当作立即数,可以当做初始化数组长度的下标。
其特点有两个:1.必须初始化,初始化的值必须是常量。 2.不允许普通的指针指向,只能用const类型的指针指向。
两者区别:
C语言里用const修饰的值可以不初始化,只是之后再没有机会对这个const修饰的变量赋值了。因此我们可以得出c语言里const定义的常变量和一般变量的区别很小,只是常变量定义后不能作为左值存在。但其本质,或者说是编译方式,和普通变量是一样的。
而在C++中,const修饰的量必须初始化,否则编译无法通过,即在编译的时候编译器会把使用const修饰的量都替换为其本身的值,因此就能作为数组下标了,因为编译时,编译器看到的下标并非const 定义的变量的名字,而是它对应的值的立即数。
我们下面将验证一下我们的结论:
①:
我们在.cpp文件中写下了这些代码,最终打印的结果是10和20,我们可以得出结果,程序运行后,指针p指向了a的内存,修改了a的值,这时a内存里存放的值就为20了,为什么最后打印a的值为10,不是20呢?
因为编译阶段已经把要打印的a换成了10这个立即数了,不会因为程序运行后,a值的改变而改变。
②:
刚说过c++里的const修饰的量必须初始化。初始化的值必须是个常量,不能是个普通变量,这样的原因是编译器编译时,替换const常量将会不明确,只有立即数或者之前定义过的const常量是明确的具体的数字。
我们这里看到b不能作为初始化数组长度的下标了,因为将变量a赋值给了常量b,b会退化成成为常变量。
而这里,我们间定义好的const常量赋值给了b,是允许的。
PS:并且在C++中,这个const修饰的数据,最终生成的符号是local属性的,即只有本文件可见的。因为编辑器不关注local区域,只关系global区域。
如果想要把const修