1、 c语言中的const
#include<stdio.h>
void main()
{
const int a = 10;
//int arr[a] = { 0 }; 不能用a作为数组下标
//a = 20; //不能进行直接修改
printf("修改前a=%d\n", a);
int *p = &a;
*p = 20;
printf("修改后a=%d\n",a);
}
(1)可以看出,在c语言中,const 修饰的变量是常变量,它的性质还是属于变量,只不过是具有常性的变量,也就是说:它不能通过直接作为左值的方式来进行修改;
(2)在编译过程中,与变量一样的方式处理;
(3)它还是属于变量,因此不能作为数组的下标;
(4)虽然不能直接直接修改a的值,但是可以通过获取a的地址来间接修改。
2、 c++中的const
#include<iostream>
using namespace std;
int main()
{
const int a = 10;
//const int b; 必须初始化
int arr[a] = { 0 };
//a = 20;
cout << "修改前a=" << a << endl;
int *p = (int*)&a;
*p = 20;
cout << "修改后a=" << a << endl;
return 0;
}
可以看出,在c++中,const 修饰的变量是常量,它也就具有常量的性质。那么:
(1)它不能通过直接作为左值的方式来进行修改;
(2)它可以作为数组下标使用;
(3)它必须被初始化;
(4)在编译过程中,所有使用a的地方会被替代成10;(c++编译器对const常量的处理当碰到常量声明时,在符号表中放入常量;编译过程中若发现使用常量则直接以符号表中的值替换)
但是有时它也会退化为常变量,比如:
int c=10;
const int a=c;//当被初始化为变量时
3.对于内陪的数据类型,如:int,float,double等。如果使用const修饰,C++编译器并不为之分配内存,而是把它放在编译器的符号表里。但是C编译器却不同,会为之分配内存。如:
const int bufsize=100;
char buffer[bufsize];
在C++编译器中编译上面两句没问题的。我们知道,我们定义的数组,编译器必须要知道其数组的大小,并且为之分配内存,也就是数组的大小是一个常量表示式,能够被在编译阶段确定下来,否则就会编译出错。在C++编译中,因为编译器并没有为bufsize为配内存,而只是把它保存在符号表中,当编译Char buffer[bufsize];这句时会到符号表里查bufsize的值,然后再为之为配内存,所以是没问题的。
而在C编译器中,编译上面两句却编译不过,因为编译器会为bufsize为配内存,编译器并不会检查内存里的值,而只检查数据的类型,所以不会知道bufsize的值是多少,在编译阶段不能确定数组的大小,所以会出错。
注意:如何解释取地址?
编译过程中若发现对const使用了extern或者&操作符,则会对应的常量分配存储空间(为了兼容c)。c++编译器虽然可能为const常量分配空间(进行&运算时),但是不会使用其存储空间中的值。
结论:
C语言中const常(变)量:其是只读变量,有自己的储空间,能通过地址间接修改其的值。
C++中的const常量:其是放在符号表中,可能分配存储空间,也可能不分配存储空间 ,使用&符号时候才分配一个临时内存空间。