抱歉,这似乎是一个菜鸟问题,但这对 Google 来说真的很痛苦。我正在使用 C++,虽然我可以通过指针和引用获得,但有时对我来说仍然很神秘。

我有一些代码,沿着 SomeClassName **pointer 的行,我想知道为什么有两个星号而不是一个?

最佳答案

用图片来解释要容易得多,但我们会试一试。如果您已经知道其中的一些,请道歉。

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

例子更容易。假设我们有 3 个这样声明的变量:

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() 中声明的变量?希望这很清楚。

关于c++ - SomeClass ** ptr之间的区别;和 SomeClass *ptr;,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8066698/

10-14 07:15