C++中的**是什么?

54
我看到一些代码,以及由我的编译器生成的一些错误,在变量之前有一个'**'标记(例如 **variablename unreferenced--或其他什么,我不记得具体是什么了)。 我相当确定这与指针有关,如果我猜测它看起来像是尝试进行两次解引用。 '**'相当难搜索。 有人能给我指向一个好的网站/文档,或者在这里解释一下吗?
谢谢。
很好的回答。 如果我可以补充一点,有哪些情况下将指针指向指针会很有用?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?

1
重复:https://dev59.com/THRB5IYBdhLWcg3wgHar - S.Lott
11个回答

58

**实际上不仅仅是指针到指针(在声明中),而且也可以表示对两次解引用的结果(在语句中)。

在C语言中经常使用它,因为C语言没有表示引用的 & 符号。例如,用于更新返回值类型为指针的返回值:

int alloc_foo(struct foo **foo_ret)
{
    *foo_ret = malloc(sizeof(struct foo));
    return 1; /* to indicate success; return value in foo_ret */
}

48

你可能熟悉main()函数的签名:

int main(int argc, char* argv[])
以下内容等价:
int main(int argc, char** argv)

在这种情况下,argv是指向char*数组的指针。

在C语言中,索引运算符[]只是执行指针算术运算的另一种方式。例如,

foo[i]

生成的代码与

*(foo + i)

14

这不是一个**标记。它只是一个后面跟着另一个*标记的*标记。在您的情况下,您有一个指向指针的指针,并且它被解引用两次以获取实际指向的内容。


12

** 是指针的指针。

它可能是一个矩阵(数组的数组)或一个字符串数组(char 数组),等等。


7
这是一个双重引用。
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。


6

我想强调一下指向指针的用途。虽然其他帖子已经提到了大部分用途,但我认为重申可能会有所帮助。

  • 它允许被调用者修改调用者拥有的指针。例如,可以传递一个指向字符串开头的指针指针,被调用者可以修改指向的指针,使其指向字符串中特定字符出现的位置。

  • 因为数组退化为指针(指针可以视为数组),如果你有:

    • 指向数组的指针。这是上述情况的概括,因为“字符串”(至少是C风格的字符串)实际上只是一个char数组。

    • 指针数组。例如,你可以有一个指向对象的指针数组,允许多态性,或者一个指向存储在另一个集合中选择的对象的指针数组。

    • 数组的数组。同样,数组退化为指针,因此这是上述情况的具体情况。这经常用于所谓的“不规则”数组(与矩形数组相对)。


5

3
  • int **var 声明一个指向指针的指针
  • **var 引用指向指针的指针所指向的指针的内容

1

一个常见的用途是允许函数将指针设置为null。
因此,free(pointer)会释放分配给指针的内存,但会使指针危险地指向空闲内存。
相反,声明一个my_free(**pointer),并调用my_free(&pointer),这样my_free()在释放内存后可以将指针设置为null。



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接