很抱歉这似乎是一个初学者问题,但是在Google上找到确实很麻烦。我正在使用C ++,虽然我可以使用指针和引用,但有时仍然很难理解。
我有一些代码,类似于SomeClassName **pointer
,我想知道为什么有两个星号而不是一个?
如果有图片的话,解释起来会容易很多,但我们也尽力说得清楚。如果你已经了解其中一些内容,请见谅。
指针只是一个变量,它保存值,就像 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()中声明的变量了吗?希望这很清楚。
SomeClassName **pointer
表示"指向指针的指针,该指针指向 SomeClassName
",而 SomeClassName *pointer
表示"指向 SomeClassName
对象的指针"。SomeClasName ****pointer.