编程小白探索笔记---c++与C语言中const常量的基础和const符号表机制探究
复习笔记:
示例代码
在C语言编辑器中
> void main()
> {
>
> const int a = 10;
> //a=11;
> int *p = NULL;
> p = (int*)&a;
> *p = 20;
> printf("a:%d\n",a);
> //system("pause");
> }
输出的结果:a:20
在C语言中a的值已经发生了改变,原本的
而在c++编译器中相同的代码,输出的却是不同的值
void main()
{
const int a = 10;
//a=11;
int *p = NULL;
p = (int*)&a;
*p = 20;
printf("a:%d\n",a);
system("pause");
}
输出的结果:a:10
面对俩个不同的结果,这是不是让人很疑惑呢?
现在,让我们回到const常量的定义
const常量的定义:
C++中常量
a. 常量: 其值在程序运行的过程中不会发生改变,但是定义常量的时候可以设置初始值。
C++中使用const关键字来定义一个常量。
//a是常量
const int a=10;
//下面的两种方式是一样的,都是定义一个常量
const int b =8; int
const c =9;
b. 对于常量,编译器会将其放在一个只读的内存区域,其值不能发生改变。
c. 使用常量的好处就在于灵活,程序中多次用到常量,修改其值时,只需要改变定义时候的常量值就可以。
d. 注意: 定义函数时,如果在函数体中不需要修改形式参数的值,建议将形式参数的值设为常量(const),以防用户不小心修改了这个值,会出现错误消息。
也就是说, const 修饰的变量是一个常量,在程序执行的过程中其值都不会发生改变。
回顾到c和c++中俩种,这让我们感觉C语言中的const是一个冒牌货,而c++语言中的const是一个真正的常量,然而实际的原因不是这样
实际原因:
在c++编译的内存空间中,当执行
p = (int*)&a;
时,代码会先对a取地址,然后再把这个地址赋值给p,此中的过程是对a取地址时,c++编译器会开辟一块新的内存空间,从而来存放a原先这个变量所存储的值
然后再将这块内存空间赋给p,相当于一个指针p指向了这块内存空间。当执行如下语句:
*p = 20;
p所指向的内存空间中的值已经发生了改变,而a变量本身的值并没有发生改变。
void main()
{
const int a = 10;
//a=11;
int *p = NULL;
p = (int*)&a;
*p = 20;
printf("a:%d\n",a);
printf("*p=%d\n",*p);
system("pause");
}
如果我们加上这句
printf("*p=%d\n",*p);
结果是p=20
他输出的值就会是p指向的值了
总结
c++中const常量与C语言中不同的是他在赋值的时候会开辟出一个新的空间去存储值,如果没有区分这一点,将会很大程度让你的代码出错
望加油,勉励共进!