很抱歉,这似乎是一个新手问题,但这对谷歌来说真的很痛苦。我正在使用C ++,虽然我可以通过Pointers和References获取,但有时我仍然非常神秘。
我有一些代码,与SomeClassName **pointer
一致,我想知道为什么有两个星号而不是一个?
答案 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.