繁体   English   中英

C++ 中的指针和动态分配 Arrays 错误

[英]Pointers and Dynamically Allocating Arrays error in C++

我正在了解指针的介绍,但我不理解以下代码。

int main(){
        int *p;
        p=new int[5];
        cout << p <<endl;  // line 4
        *p=3;
        p=p+1;
        cout <<p <<endl;  // line 7
        *p=7;
        cout << p[0] <<endl;
    }

第 4 行和第 7 行将 memory 位置分别打印为 0xd91730 和 0xd91734,我明白这一点。 但是,为什么最后一行 `( p[0] ) 在屏幕上打印 7 。 不是 p[0] = 3 而是在第 5 行中指定的。我不理解这个概念。 有人可以帮忙吗? 谢谢你。

它实际上是:

p = new int[5]这很好。 你分配了 5 个整数值 memory。 p[0]你已经存储了值 3 ( *p = 3 )..

然后您将指针p偏移 1 ( p = p + 1 ).. 现在您写*p = 7 .. 当然打印P[0]将打印 7 因为您已将 p 从其原始 position 偏移您执行了p = p + 1 (P 不再指向您执行new int[5]时拥有的相同 memory 地址)。

您从未将指针减小回指向 3。

如果你在增加它之后delete[] p ,它会是未定义的行为,并且可能会崩溃,因为你正在删除 memory 位置,因为你增加了 P。

如果您希望它打印 3,则必须在将 7 写入 P[1] 之后执行P = P - 1

在处理指针时,方括号表示法只是取消引用指针的方式。

p[x]   is syntactically equivalent to   *(p + x)

因此,您正在取消引用 memory 位置 x 指向指针前面的位置。

在你的代码中。 分配 memory 后,移动指针:

    p = p+1;   // This moves p to point at the next location in memory.

现在您的 memory 看起来像这样:

Memory      0xd91730        [0, 0, 0 ,3]   => 4 bytes 
p --------->0xd91734        [0, 0, 0, 7]   => 4 bytes (yes I am making an assumption 
            0xd91738        [?, ?, ?, ?]               about layout for demonstrating
            0xd9173c        [?, ?, ?, ?]               purposes) 

取消引用 p 将为您提供0xs91734处的内容。

尝试添加以下行:

            std::cout << p[-1] << "\n"; // Should return the 3 you were looking for

只是为了好玩尝试:

            std::cout << 0[p] << "\n";  // Blows your mind but works.

            // Pointer + integer is a pointer.
            // integer + Pointer is also a pointer.
            // So 0[p] => *(0 + p) => *(p + 0) => p[0]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM