在本篇文章中,我们主要介绍地址修改的内容,自我感到有个不错的建议和大家分享下
昨天在写程序时,突然想到了一个问题: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
地址和修改
---------------------------------