【发布时间】:2012-03-13 15:44:35
【问题描述】:
我正在处理 c 谜题,遇到了这个问题。 在这里,在 printf 语句中,指针会增加一次,所以我认为它会指向随机数! 但我不明白为什么 25 是输出? 谁能帮我理解? 非常感谢;)
void main()
{
int const * p=5;
printf("%d",++(*p));
}
答案:25
【问题讨论】:
标签: c
我正在处理 c 谜题,遇到了这个问题。 在这里,在 printf 语句中,指针会增加一次,所以我认为它会指向随机数! 但我不明白为什么 25 是输出? 谁能帮我理解? 非常感谢;)
void main()
{
int const * p=5;
printf("%d",++(*p));
}
答案:25
【问题讨论】:
标签: c
您正在指向随机的一段内存(地址 5)。然后,您将增加存储在那里的任何内容,并打印结果。这是未定义的行为;你的程序可以做任何事情。
更新:实际上,这段代码甚至不应该编译。您已将其声明为指向const 的指针,因此编译器不应让您递增。你用的是什么编译器?
【讨论】:
int const *,而不是const int *:++p 是非法的,而不是++*p
int const * 和 const int * 是一回事。
int *const p。
int const * == const int *... 你的意思是int * const, const 可以放在任何一边,但为了避免混淆,它应该总是放在类型的右边,并且从右到左读取常量.
您尝试做的事情是错误的。它从一个没有强制转换的整数创建一个指针。此外,您的声明使p 成为一个指向常量整数的指针,并且您不能增加指针p 指向的值。还有它的值,而不是在printf 语句中递增的指针。
【讨论】:
每当我们将常量分配给指针时,它应该类似于int const * p=(unsigned int*)5。如果幸运的话,5 将在程序的地址空间中。如果没有,那么你会得到一个段错误。这就是为什么它是未定义的行为。检查此以获取有关 int const、const int 等的更多详细信息。const int = int const?
【讨论】: