1.区别
在C中,const修饰的变量是常变量(或伪常量),会分配内存空间,凡是分配内存的变量基本都可以通过指向其地址空间的指针去修改其内容,所以虽然不能直接修改,但可以通过指针修改,故叫做伪常量。
在C++中,const修饰的变量是真正的常量,必须初始化,通常不会为其分配内存,这些常量以键值对的形式存放在一张符号表中,编译过程中若发现该常量则直接以符号表中的值替换。
const区别 | C | C++ |
---|---|---|
是否分配内存 | 是 | 依具体情况而定 |
默认链接方式 | 外部链接 | 内部链接 |
是否需要初始化 | 不一定 | 必须初始化 |
范例:const int a=5; int arr[a]={0}; | 编译不通过 | 编译通过 |
说明:
(1)内部链接:编译器只对正被编译的文件创建存储空间,别的文件可以使用相同的表示符或全局变量.C/C++中内连接使用static关键字指定。
(2)外部链接:所有被编译过的文件创建一片单独存储空间.一旦空间被创建,连接器必须解决对这片存储空间的引用.全局变量和函数使用外部连接.通过extern关键字声明,可以从其他文件访问相应的变量和函数。
简单点说,在C中你在一个源文件中有const int a=10;
那么在另外的源文件中可以这样使用这个变量extern const int e;
,即在C中const修饰的变量可以被外部文件使用。而在C++中,使用const修饰的变量只能在当前文件中使用。
2.C++中使用const修饰变量时,分配内存的情况:
分配内存的情况 | 示意代码 |
---|---|
1.用普通变量初始化const修饰的变量 | int b = 10; const int a = b; |
2. const修饰引用 | const int &a = 10; |
3.自定义数据类型 | struct Student { char name; int age; }; const Student s={‘w’, 10}; |
以上情况都可以通过指针去修改其内容 | 如:int * p = (int *)&a; *p = 100; //对应a的值也会改变 |
4.使用&操作符取const常量的地址 | const int a = 5; int *p = (int *)&a; *p = 100; //注意这种情况分配的是临时内存空间,指针p并不会去修改a的值 |