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

时间:2011-11-09 14:47:12

标签: c++ c

很抱歉,这似乎是一个新手问题,但这对谷歌来说真的很痛苦。我正在使用C ++,虽然我可以通过Pointers和References获取,但有时我仍然非常神秘。

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

4 个答案:

答案 0 :(得分:14)

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

指针只是一个包含值的变量,就像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()中声明的变量?希望这很清楚。

答案 1 :(得分:8)

SomeClassName **pointer表示“指针指向SomeClassName”的指针,而SomeClassName *pointer表示“指向SomeClassName对象的指针”。

希望有所帮助,

答案 2 :(得分:3)

答案 3 :(得分:3)

也许这会帮助你理解它:指针只是一个引用内存中某个位置的数字。通常,内存中包含您的对象。但在这种情况下,它只有另一个数字,它指的是记忆中的另一个地方,最终有你感兴趣的对象。这可以链接到荒谬的地步;你可以SomeClasName ****pointer.