&i(内部主函数)和p(内部函数函数)都保持相同的地址.我知道一个常量对象/变量不能被修改但我能够在func函数中使用(*p)++增加变量i,但结果并没有反映在main函数中.这是为什么?
#include <iostream>
using namespace std;
void func(int *p){
(*p)++;
printf("%p %d\n", p, *p);
}
int main(int argc, char **argv){
const int i = 47;
const int *p = &i;
func(const_cast<int *>(p));
printf("%p %d\n", &i, i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到这个输出:
000000000022fe44 48
000000000022fe44 47
Run Code Online (Sandbox Code Playgroud)
const在它的定义点声明的对象确实是一个const object.这意味着修改该对象的结果是未定义的.
未定义意味着它完全取决于编译器对代码的要求.在你的情况下,似乎编译器在只读内存中分配了真正的const.当您将此函数传递给非常量指针时,编译器可能已将该函数与另一个包含类似值的内存一起提供.但这只是我的猜测.
编辑回复@FreeNickName的评论: -
由于两个指针的地址(一个在main中,另一个在func中)是相同的,我认为上面没有给出正确/完整的图片.也许编译器只是忽略该增量指令,因为它被应用于只读的内存.