今天在论坛上看到了一个关于const的问题,查了资料,然后整理了一下。
问题如下:
#include <iostream>
using namespace std;
void main()
{
const int ppp=998;
const int* pca=&ppp;
int* p=const_cast <int*>(pca);
* p = 10; //ppp的值改变了吗?
cout<<&ppp<<endl;
cout<<pca<<endl;
cout<<p<<endl;
cout<<*p<<endl;
cout<<ppp<<endl; //为什么同样的地址输出的值不一样?
}
输出结果可以看到:&ppp,pca,p的值都是一样的,即地址是一样的,但是*p和ppp的输出值却是不一样的?这是为什么么呢?
查了相关资料后,我认为应该是这样的。const int ppp=998;如果我们没有对ppp进行取地址或者其它与ppp地址相关的操作,ppp这个常变量在内存中其实是不存在的,也就是内存不为ppp分配地址的。程序运行时,代码中的所有的ppp都直接被替换成998,这样的话,既节省了内存又方便了操作。
但是如果对ppp的地址进行操作,例如:const int*pca=&ppp;那么ppp就会在内存中创建变量ppp,这样我们就可以对ppp的内存地址及其内容进行操作了。但按照上面的说法,指针p==&ppp,为什么指针p所指的内容和ppp中的内容不一样呢?为什么同样的地址,输出的值却不一样呢?这应该就是C++的const机制。
原因如下:
虽然对ppp进行有关地址的操作后,ppp会在内存中创建了ppp变量。但是const仍然会告诉ppp说:“虽然你在内存中创建了ppp变量,但是只有当有人想进行和你地址有关的操作时你才可以用这个内存中的ppp变量,代码中其余的所有ppp你依然还是给我全部替换成998。” 也就是说,凡是代码中与ppp地址无关的操作,那么代码中的ppp还是直接替换成998;凡是代码中与ppp地址有关的操作,那么使用的ppp其实是内存中的变量ppp! (注:内存地址中存的是int ppp=998,而不是const int ppp=998,const只是一种机制,并不是一种数据类型!)
例如:对这段程序进行调试,可以发现:
const int ppp=998;
const int* pca=&ppp;
int* p=const_cast <int*>(pca);
* p = 10;
当程序执行到*p=10时,在调试结果中发现&ppp和指针p的值都是一样的。而且ppp和*p的值都是10。因为这里的ppp其实是内存中的变量ppp。
再往下执行到
cout<<&ppp<<endl; //行1
cout<<pca<<endl; //行2
cout<<p<<endl; //行3
cout<<*p<<endl; //行4
cout<<ppp<<endl; //行5
行1中的ppp由于执行了操作&ppp,所以这里的ppp是内存中的ppp变量,因此输出的结果行1、行2 、行3都是一样的。而行4输出的是*p的值也就是10,行5中的ppp没有对ppp地址相关的操作,所以其 实在编译时就直接被替换成了998,它不是内存中的那个变量ppp。 所以,输出结果是不同的!
如有不对的地方,请多多指正!