SomeClass **ptr; 和 SomeClass *ptr; 的区别

4

很抱歉这似乎是一个初学者问题,但是在Google上找到确实很麻烦。我正在使用C ++,虽然我可以使用指针和引用,但有时仍然很难理解。

我有一些代码,类似于SomeClassName **pointer,我想知道为什么有两个星号而不是一个?

4个回答

14

如果有图片的话,解释起来会容易很多,但我们也尽力说得清楚。如果你已经了解其中一些内容,请见谅。

指针只是一个变量,它保存值,就像 int 或 char 一样。使它成为指针的是该变量中的值是内存中其他位置的地址。

举个例子会更容易理解。假设我们声明了三个变量:

int iVar = 42;  // int
int *piVar = &iVar;  // pointer to an int
int **ppiVar = &piVar; // pointer to (pointer to an int)

我们的内存可能是这样的:

Address     Name          Value
0x123456    iVar          42
0x12345A    piVar         0x123456
0x12345E    ppiVar        0x12345A

所以,你知道可以这样引用piVar:

*piVar = 33;

并改变iVar的值

Address     Name          Value
0x123456    iVar          33
0x12345A    piVar         0x123456
0x12345E    ppiVar        0x12345A

你可以使用ppiVar来做同样的事情:

*ppiVar = NULL;

Address     Name          Value
0x123456    iVar          33
0x12345A    piVar         0
0x12345E    ppiVar        0x12345A

因为指针仍然只是一个变量,我们使用 * 改变了地址上存储的值。

为什么要这样做?其中一个应用是从函数中分配内存:

void MyAlloc(int **ppVar, int size)
{
    *ppVar = (int *)malloc(size);
}

int main()
{
    int *pBuffer = NULL;

    MyAlloc(&pBuffer, 40);
}

看到我们是如何通过解引用指针来访问在main()中声明的变量了吗?希望这很清楚。


太棒了,这解决了我下一个问题,即这如何有用。我正在阅读的代码更加清晰易懂,谢谢! - chrisburke.io

8
SomeClassName **pointer 表示"指向指针的指针,该指针指向 SomeClassName",而 SomeClassName *pointer 表示"指向 SomeClassName 对象的指针"。
希望这能帮到你,

3

3
也许这样能帮助你理解:指针只是一个数字,它指向内存中的某个位置。通常情况下,该内存中包含了你要操作的对象。但在这种情况下,它只包含了另一个数字,该数字指向另一个内存位置,最终才包含你感兴趣的对象。这种链式结构可能会一直延伸到荒谬的地步;你甚至可以拥有SomeClasName ****pointer.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接