我已经看到了一些代码,以及我的编译器生成的一些错误,这些错误在变量之前有一个'**
'标记(例如**变量名未引用 - 或者某些东西,我不记得确切副手)。我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次。 “**
”相当难以辨认。有人可以给我一个好的网站/文档,或者有人会在这里解释一下吗?
感谢。
很好的回应。如果我可以添加,那么指向指针的指针有什么用呢?你不应该只是使用原始指针而不是创建另一个指向原始指针的指针吗?
答案 0 :(得分:44)
**实际上并不是指向指针的指针(如声明中所示),但也是取消引用的解引用(在语句中)。
它经常用于没有&的C语言中。引用的表示法,例如更新作为指针类型的返回值:
int alloc_foo(struct foo **foo_ret)
{
*foo_ret = malloc(sizeof(struct foo));
return 1; /* to indicate success; return value in foo_ret */
}
答案 1 :(得分:30)
您可以识别main()的签名:
int main(int argc, char* argv[])
以下是等效的:
int main(int argc, char** argv)
在这种情况下,argv是指向char *。
数组的指针在C中,索引运算符[]只是执行指针运算的另一种方式。例如,
foo[i]
生成与
相同的代码*(foo + i)
答案 2 :(得分:11)
这不是**
令牌。它只是一个*
令牌,后跟另一个*
令牌。在你的情况下,你有一个指向指针的指针,它被解除引用两次以获得真正指向的东西。
答案 3 :(得分:8)
**是指向指针的指针。
它可能是一个矩阵(一个数组数组)或一个字符串数组(一个char数组)等。
答案 4 :(得分:6)
这是双重引用。
int i = 3;
int* ptr_to_i = &i;
int** ptr_to_ptr_to_i = &ptr_to_i;
std::cout << **ptr_to_ptr_to_i << std::endl;
打印3。
答案 5 :(得分:5)
我只想强调指向指针的一些用法。其他帖子中大部分都触及,但我认为重复可能有所帮助。
它允许被调用者修改调用者拥有的指针。例如,可以将指针传递给指向字符串开头的指针,并且被调用者可以修改指向指针,现在指向字符串中发生特定字符的位置。
因为数组降级为指针(并且指针可以被视为数组),所以如果你有以下指针,你经常会看到指向指针的指针:
指向数组的指针。这是对上述情况的概括,因为“字符串”(无论如何都是C风格的字符串)实际上只是char
s的数组。
指针数组。例如,您可能有一个指向对象的指针数组,允许多态,或指向一组指针来选择存储在另一个集合中的对象。
数组数组。同样,数组降级为指针,因此这是上述的特定情况。这通常用于所谓的“锯齿状”阵列(而不是矩形)。
答案 6 :(得分:4)
你可以按字面解释 - pointer to a pointer
答案 7 :(得分:3)
int **var
声明指向指针的指针**var
引用指针的内容,指针本身指向指针答案 8 :(得分:1)
一个常见的用途是它允许函数将指针设置为null 所以free(指针)释放分配给指针的内存,但使指针危险地指向空闲内存 而是声明一个my_free(**指针)并调用my_free(&amp; pointer),这样my_free()可以在释放它之后将指针设置为null。
答案 9 :(得分:1)
答案 10 :(得分:0)
这是C ++ Sigils的魅力之一。根据我自己的个人经验,我可以使用STL的阵列和放大器上的解引用操作符来保证更快,更高效的读取访问性能。向量。如果你很好奇,我也采用了习惯性的共享指针方法。 :)