C++ 两者;i和p指向相同的变量,但显示不同的结果?

C++ 两者;i和p指向相同的变量,但显示不同的结果?,c++,C++,&i(主函数内部)和p(函数内部)拥有相同的地址。我知道常量对象/变量不能修改,但我可以在func函数中使用(*p)++增加变量I,但结果不会反映在主函数中。为什么呢 #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;

&i(主函数内部)和p(函数内部)拥有相同的地址。我知道常量对象/变量不能修改,但我可以在func函数中使用(*p)++增加变量I,但结果不会反映在主函数中。为什么呢

#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;
}

因为。您正在修改常量数据。这应该是一个很大的提示。

因为。您正在修改常量数据。
const\u cast
应该是一个很大的提示。

在定义上声明的
const
对象实际上是一个
const对象。这意味着修改该对象的结果未定义

未定义意味着编译器完全可以决定它想对代码做什么。在您的例子中,似乎编译器在只读内存中分配了真正的常量。当您将它传递给使用非常量指针的函数时,编译器可能已经为该函数提供了另一个包含类似值的内存。但这只是我的猜测

根据@Free昵称的评论编辑:-


由于两个指针的地址(一个在main中,另一个在func中)是相同的,我认为上面没有给出正确/完整的描述引擎盖下发生了什么。也许编译器只是忽略了增量指令,因为它应用于只读内存

在定义上声明的
const
对象实际上是一个
const对象
。这意味着修改该对象的结果未定义

未定义意味着编译器完全可以决定它想对代码做什么。在您的例子中,似乎编译器在只读内存中分配了真正的常量。当您将它传递给使用非常量指针的函数时,编译器可能已经为该函数提供了另一个包含类似值的内存。但这只是我的猜测

根据@Free昵称的评论编辑:-


由于两个指针的地址(一个在main中,另一个在func中)是相同的,我认为上面没有给出正确/完整的描述引擎盖下发生了什么。也许编译器只是忽略了增量指令,因为它应用于只读内存

当心!这里有龙!您告诉编译器
i
const
。它将常量值折叠到printf arg中。它没有义务对它如此明智,或者根本不明智。你骗了它。这取决于你说的。当心!这里有龙!您告诉编译器
i
const
。它将常量值折叠到printf arg中。它没有义务对它如此明智,或者根本不明智。你骗了它。这取决于你所说的。他在一个打印语句中引用指针,在另一个打印语句中引用内存地址。他在一个打印语句中引用指针,在另一个打印语句中引用内存地址。你的解释似乎合理,但有趣的是,主函数和func函数中的指针值是相同的,所以价值观不同是很奇怪的。无论如何,+1)新年快乐!:)@Free昵称第一个和你一样…是的,很好的一点我没有注意到。编译器不可能在R/O内存中分配常量。如果有,那么语句
(*p)++
将导致访问冲突。更简单的是:每次使用整型常量的名称作为右值(例如在调用
printf
)时,编译器只需用其逐字值替换即可。@freeinkname
const int i=47是一个常量。当编译器看到这一点时,可以优化从
i
加载的值,而不是使用分配给它的任何值。在
main
中调用
printf
时,它正在执行
printf(“%p%d\n”,&i,47)
。当您在
func
中打印值时,它不知道它是
const
并从内存中加载它。这就是为什么你会得到两个不同的值。我一直想说。。。谢谢,@CaptainObvlious:)你的解释似乎很合理,但有趣的是,主函数和func函数中的指针值是相同的,所以值不同很奇怪。无论如何,+1)新年快乐!:)@Free昵称第一个和你一样…是的,很好的一点我没有注意到。编译器不可能在R/O内存中分配常量。如果有,那么语句
(*p)++
将导致访问冲突。更简单的是:每次使用整型常量的名称作为右值(例如在调用
printf
)时,编译器只需用其逐字值替换即可。@freeinkname
const int i=47是一个常量。当编译器看到这一点时,可以优化从
i
加载的值,而不是使用分配给它的任何值。在
main
中调用
printf
时,它正在执行
printf(“%p%d\n”,&i,47)
。当您在
func
中打印值时,它不知道它是
const
并从内存中加载它。这就是为什么你会得到两个不同的值。我一直想说。。。谢谢你,@CaptainObvlious:)
000000000022fe44 48
000000000022fe44 47