抱歉,这似乎是一个菜鸟问题,但这对 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/