循环中的C ++指针算法和内存管理?

时间:2017-07-07 03:38:36

标签: c++

我开始使用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 - )时,程序会进入无限循环。 究竟发生了什么?

非常感谢。

1 个答案:

答案 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;
    }
}

higher precedence

括号和运算符优先级很重要!