我开始使用C ++。我想了解不同之处 在玩这段代码时输出。
int main()
{
int i = 3;
int *ptr = &i; //stores address of the i
while(*(ptr)--) //the same as i--
{
cout << *ptr << endl;
}
}
当我运行此代码时,我理解了所引用的值 ptr,即&#34; i&#34;,从中减去1,循环退出 什么时候&#34;我&#34;等于0.但是当我使用 while(* ptr - )而不是而(*(ptr) - )时,我得到一个随机整数列表,最终会失败为0,循环中断。
根据我的理解,当我使用 * ptr - 时,我会从每个循环的&amp; i(* ptr)的初始地址减去一个字节(一个int的大小)。但为什么程序最终会终止?无论&#34; i&#34;的价值如何?是,程序打印23个随机数,最后一个为0,循环退出。由于程序内存不足,我是否应该收到溢出错误?
但是,当我使用 while(ptr - )时,程序会进入无限循环。 究竟发生了什么?
非常感谢。
答案 0 :(得分:2)
(ptr)
与ptr
相同,因此(ptr)--
与ptr--
相同。
*ptr--
与i--
不一样!
您正在将operator--
应用于指针的右侧。后缀/后缀operator--
的{{3}}比operator*
高。因此,*ptr--
与*(ptr--)
相同,而不是您期望的(*ptr)--
。
IOW,首先评估ptr--
,它返回当前指针的副本,然后递减指针,然后你取消引用复制指针以检索以前指向的值。
这就是你看到垃圾的原因 - 你将指针递减到不属于你的内存中。
要简单地递减int
而不是指针,请改用(*ptr)--
。 IOW,首先取消引用指针,然后递减指向的值,例如:
int main()
{
int i = 3;
int *ptr = &i; //stores address of the i
while((*ptr)--) //the same as i--
{
cout << *ptr << endl;
}
}
括号和运算符优先级很重要!