在函数内初始化指针。这个怎么运作?

时间:2014-10-28 15:51:02

标签: c++ pointers

我有这段代码并且有效:

void InitPointer(int** pp)
{
    *pp = new int{ 10 };
}

int* p{ nullptr };
InitPointer(&p);

你能帮我弄清楚它是如何工作的吗?原始指针 int * p 无处可寻。我怎么能写到哪里? 例如,此代码抛出rte:

int* p{ nullptr };
*p = 10;

3 个答案:

答案 0 :(得分:4)

取消引用nullptr是未定义的行为:

int* px = nullptr;
  

有时需要将指针标记为无效。这可以   通过将nullptr赋值给指针来实现。这个指针是   调用空指针并取消引用它会导致未定义   行为。

来源:http://en.cppreference.com/book/pointers

这正是

发生的事情
int* p{ nullptr };
*p = 10;

虽然在第一种情况下你没有写到任何地方,因为代码

void InitPointer(int** pp)
{
    *pp = new int{ 10 };
}

int* p{ nullptr };
InitPointer(&p);

将指针初始化为值为10的新整数。它大致以这种方式工作:

int* p{ nullptr };

Address | Variable Name | Value
0x10      p               nullptr

InitPointer(&p);

Address | Variable Name | Value
0x10      p               nullptr
0x20      pp              0x10

*pp = new int{ 10 };

Address | Variable Name | Value
0x10      p               0x30
0x20      pp              0x10
0x30      -               10 (int)

因此你的p指针现在指向有效的内存(以后应该被释放)。

答案 1 :(得分:2)

您的示例中有两个指针。第一个指向无处,但第二个指向第一个。并使用指向指针的指针,您将指针指向某处 - 听起来很容易吗?也许这会更好:

|---------|        |-------|
| nullptr | <----------X   |
|--- p----|        |--pp---|

因此,pp指向p的“内容”。使用它,该函数会更改p指向的内容:

|----|        |---------|        |-------|
| 10 | <-----------X    | <----------X   |
|----|        |----p----|        |--pp---|

答案 2 :(得分:2)

你不是无处可写。您将&p(指向p的指针)传递给函数(因此第二个*,指示指向指针的指针),然后取消引用该指针以写入{ {1}}本身。

第二个示例没有额外的间接级别,只是尝试写入p指向的不存在的对象,因此错误。