C++ 两者;i和p指向相同的变量,但显示不同的结果?
&i(主函数内部)和p(函数内部)拥有相同的地址。我知道常量对象/变量不能修改,但我可以在func函数中使用(*p)++增加变量I,但结果不会反映在主函数中。为什么呢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;
#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
)时,编译器只需用其逐字值替换即可。@freeinknameconst int i=47代码>是一个常量。当编译器看到这一点时,可以优化从i
加载的值,而不是使用分配给它的任何值。在main
中调用printf
时,它正在执行printf(“%p%d\n”,&i,47)
。当您在func
中打印值时,它不知道它是const
并从内存中加载它。这就是为什么你会得到两个不同的值。我一直想说。。。谢谢,@CaptainObvlious:)你的解释似乎很合理,但有趣的是,主函数和func函数中的指针值是相同的,所以值不同很奇怪。无论如何,+1)新年快乐!:)@Free昵称第一个和你一样…是的,很好的一点我没有注意到。编译器不可能在R/O内存中分配常量。如果有,那么语句(*p)++
将导致访问冲突。更简单的是:每次使用整型常量的名称作为右值(例如在调用printf
)时,编译器只需用其逐字值替换即可。@freeinknameconst int i=47代码>是一个常量。当编译器看到这一点时,可以优化从i
加载的值,而不是使用分配给它的任何值。在main
中调用printf
时,它正在执行printf(“%p%d\n”,&i,47)
。当您在func
中打印值时,它不知道它是const
并从内存中加载它。这就是为什么你会得到两个不同的值。我一直想说。。。谢谢你,@CaptainObvlious:)
000000000022fe44 48
000000000022fe44 47