地址修改const变量真的不能修改吗?

在本篇文章中,我们主要介绍地址修改的内容,自我感到有个不错的建议和大家分享下

    昨天在写程序时,突然想到了一个问题:const变量真的不可改变吗?如果能改,应当怎么改?于是乎,就决定着手操作一番,结果程序的结果有点出其不意。但是终究还是得出了结论。若有不当,欢送各位拍砖!

    下面就来看一下这个简略的程序:

#include <iostream>

using namespace std;

int main(void)
{	
	const int sum = 0;
	cout << "sum的初始值是:" << sum << endl;	
	int *result = const_cast<int *>(&sum);
	*result = 20;

	cout << "sum的值现在是:" << sum << endl;
	cout << "result的值现在是:" << *result << endl;
	cout << "sum的地址是:" << &sum << endl;
	cout << "result的地址是:" << result << endl;
	getchar();

	return 0;
}

    程序的运行结果:

sum的初始值是:0
sum的值现在是:0
result的值现在是:20
sum的地址是:0012FF60
result的地址是:0012FF60

    怎么是这样的结果:这下让我有点迷茫,但是也感到更有意思了。刚开始我觉得,只要使用指针指向这个const常量,就可以修改,结果发明这样并不能修改const常量。通过程序的结果我们不难发明,result指向的地址确实是sum的地址,一样的地址为什么打印出来的值却不一样呢?原因是这样的:对于这类const常量,其值在编译期间是不知道的。这就意味着须要存储空间,而编译器不想保留它的符号表中的任何东西,而且一旦初始化,其值就不能改变。虽说result指向了sum的地址,可实际上指向的却是sum常量的一个拷贝的地址。当再次使用sum时,就会发明sum的值并没有被改变!

    每日一道理
心是一棵树,爱与希望的根须扎在土里,智慧与情感的枝叶招展在蓝天下。无论是岁月的风雨扑面而来,还是滚滚尘埃遮蔽了翠叶青枝,它总是静默地矗立在那里等待,并接受一切来临,既不倨傲,也不卑微。
  心是一棵树,一个个故事被年轮携载;一回回驿动与飞鸟相约;一次次碰撞使它绵密柔韧;一幕幕经历造就了它博广的胸怀。心是一棵树,独木不成林。因此,树与树既独立又相联,心与心既相异又相亲。

    还有另一种情况:

#include <iostream>

using namespace std;
const int sum = 0;

int main(void)
{
	cout << "sum的初始值是:" << sum << endl;	
	cout << "sum的地址是:" << &sum << endl;
	int *result = const_cast<int *>(&sum);
	*result = 20;

	cout << "sum的值现在是:" << sum << endl;
	cout << "result的值现在是:" << *result << endl;
	cout << "sum的地址是:" << &sum << endl;
	cout << "result的地址是:" << result << endl;
	getchar();

	return 0;
}

    这类情况是编译期间的const,通过实验,这类方法修改const,程序基本不能运行,直接报错。原因是这样的:在这个程序中,sum是一个全局变量,C++编译器不会为其分配空间,而是直接将其保存在符号表中,待要取得const常量地址时,再迫使编译器为其分配空间,所以,当result指向sum,并试图修改其内容时就会出现:在此位置写入时产生访问冲突错误!

    地址和修改

    总结:所以通过这类方法,是不能修改const常量的!

文章结束给大家分享下程序员的一些笑话语录: N多年前,JohnHein博士的一项研究表明:Mac用户平均IQ要比PC用户低15%。超过6000多的参加者接受了测试,结果清晰的显示IQ比较低的人会倾向于使用Mac。Mac用户只答对了基础问题的75%,而PC用户却高达83%。

--------------------------------- 原创文章 By
地址和修改
---------------------------------

posted @ 2013-05-29 19:30  xinyuyuanm  阅读(827)  评论(0编辑  收藏  举报