第二次在论坛上看到有人讨论这个问题, 感觉比较有意思, 所以记录一下, 请看下面这段代码:
第一次看到这段代码我感觉如果能够编译过去, 运行不出错的话, &a应该=b, *b应该=20, 至于a的值我只能猜20的可能性比较大一点, 但是在我VS2005运行的结果是:
这个结果就让人大吃一惊了, a, b既然存储在同一地址怎么值确不同呢?
看了一下网上牛人的说法, 这涉及到一个叫常量折叠的概念(认为我这说得太简单或者不好理解的可以google一下它获取更多信息), 即编译器虽然会给a分配空间, 但是在预编译阶段, 会把所有的a用10替换(这就有点像#define了), 所以虽然&a地址存放的内容改变了, 但是a依然为10.
这么做的原因是出于对const数据的保护, 防止被破坏性修改, 这个例子也再一次说明指针的灵活性, 大家使用时一点要注意.