C ++不同类型的指针

时间:2017-11-02 07:46:12

标签: c++ pointers

在下面的代码中我发现相同的指针指令会在某种情况下使应用程序崩溃,而不是在其他情况下。

#include <iostream>
using namespace std;

int main()
{
    int *p;
    *p = 50;                    //this instruction causes the crash
    int* q = new int;
    *q = 50;                    //this instruction executes ok
    cout << "p:" << p << endl;
    cout << "q:" << q << endl;
    return 0;
}

我想知道为什么会这样?

3 个答案:

答案 0 :(得分:4)

第一个指针未初始化。它没有指向具有int值的内存位置。因此,当您在下一行中对其进行deref时,就会发生崩溃。

第二个指针初始化为一个在内存中有实际空间的int。因此,当你deref它时,它会找到该空间中保存的值。

答案 1 :(得分:2)

int *p;

该指针指向任何地方,即不在该进程的任何有效地址。这就是崩溃的原因

int* q = new int;

指向new int返回的有效地址,因此有效

答案 2 :(得分:1)

我看到你需要一些指向文档的链接:

包装起来:

  • 您可以使用间接运算符(*)返回指针指向的对象(取消引用指针)。
  • 当指针实际指向某个对象时(默认情况下它们不会),您只能通过指针访问(读取或修改)对象。
  • 您可以将对象的地址指定给指针,让指针指向它。
  • 您可以使用address-of运算符(&)来获取对象的地址,以便将其分配给指针。
  • 您可以使用new运算符创建一个新对象并将地址返回给它以将其分配给指针。
  • 您必须使用delete最终销毁使用new创建的对象。
  • 当您使用指针时,您自己负责指针所指向的对象的有效性。不要指望编译器在对象泄漏或超出其生命周期结束时访问时发出警告。如果你做错了,你可能会发现未定义的行为
  • 智能指针可以帮助跟踪对象所有权并处理正确的破坏。

进一步阅读: