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

krs*_*ynx 4 c c++

对不起,这可能看起来像一个菜鸟问题,但这对谷歌来说真的很痛苦.我正在使用C++,虽然我可以通过Pointers和References获取,但有时我仍然非常神秘.

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

Joe*_*ish 14

用图片解释要容易得多,但我们会给它一个机会.如果您已经了解其中一些,请道歉.

指针只是一个包含值的变量,就像int或char一样.使它成为指针的原因是该变量中的值是某个其他位置的内存中的地址.

示例更容易.假设我们有3个变量,我们这样声明:

int iVar = 42;  // int
int *piVar = &iVar;  // pointer to an int
int **ppiVar = &piVar; // pointer to (pointer to an int)
Run Code Online (Sandbox Code Playgroud)

我们的记忆可能如下所示:

Address     Name          Value
0x123456    iVar          42
0x12345A    piVar         0x123456
0x12345E    ppiVar        0x12345A
Run Code Online (Sandbox Code Playgroud)

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

*piVar = 33;
Run Code Online (Sandbox Code Playgroud)

并更改iVar的值

Address     Name          Value
0x123456    iVar          33
0x12345A    piVar         0x123456
0x12345E    ppiVar        0x12345A
Run Code Online (Sandbox Code Playgroud)

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

*ppiVar = NULL;

Address     Name          Value
0x123456    iVar          33
0x12345A    piVar         0
0x12345E    ppiVar        0x12345A
Run Code Online (Sandbox Code Playgroud)

由于指针仍然只是一个变量,我们使用*更改了地址处的值.

为什么?一个应用程序是从函数中分配内存:

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

int main()
{
    int *pBuffer = NULL;

    MyAlloc(&pBuffer, 40);
}
Run Code Online (Sandbox Code Playgroud)

看看我们如何取消引用指针以获取main()中声明的变量?希望相当清楚.


din*_*pmi 8

SomeClassName **pointer表示"指向指针的指针SomeClassName",SomeClassName *pointer表示"指向SomeClassName对象的指针".

希望有所帮助,