【问题标题】:What is ** in C++?C++中的**是什么?
【发布时间】:2010-10-13 07:10:11
【问题描述】:

我看到了一些代码,以及从我的编译器生成的一些错误,这些错误在变量之前有一个“**”标记(例如 **variablename unreferenced-- 或者其他什么,我不记得完全不记得了) .我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次。 '**' 是相当难以用谷歌搜索的。有人可以指点我一个好的网站/文档吗?或者有人愿意在这里解释一下吗?

谢谢。

很好的反应。如果我可以添加,在哪些情况下使用指向指针的指针很有用?您不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?

【问题讨论】:

标签: c++ pointers


【解决方案1】:

** 实际上不仅是指向指针的指针(如在声明中),而且还是对解引用的解引用(在语句中)。

它经常用在没有 & 引用的 C 中,例如更新指针类型的返回值:

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

【讨论】:

    【解决方案2】:

    你可能会认出 main() 的签名:

    int main(int argc, char* argv[])
    

    以下是等价的:

    int main(int argc, char** argv)
    

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

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

    foo[i]
    

    产生与

    相同的代码
    *(foo + i)
    

    【讨论】:

      【解决方案3】:

      这不是** 令牌。它只是一个* 令牌,后跟另一个* 令牌。在您的情况下,您有一个指向指针的指针,并且它被取消引用两次以获得真正指向的内容。

      【讨论】:

        【解决方案4】:

        ** 是一个指向指针的指针。

        可能是矩阵(数组的数组)或字符串数​​组(char 数组)等

        【讨论】:

          【解决方案5】:

          这是一个双重取消引用。

          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 风格的字符串)实际上只是 chars 的数组。

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

              • 一个数组数组。同样,数组降级为指针,因此这是上述情况的特定情况。这通常用于所谓的“锯齿状”数组(与矩形相反)。

            【讨论】:

              【解决方案7】:

              你可以按字面理解——pointer to a pointer

              【讨论】:

                【解决方案8】:
                • int **var 声明一个指向指针的指针
                • **var 引用了一个指针的内容,它本身就指向一个指针

                【讨论】:

                  【解决方案9】:

                  一个常见的用途是它允许函数将指针设置为空。
                  所以 free(pointer) 释放了分配给指针的内存,但让指针危险地指向空闲内存。
                  而是声明一个 my_free(**pointer) 并调用 my_free(&pointer) 以便 my_free() 可以在释放指针后将指针设置为 null。

                  【讨论】:

                    【解决方案10】:
                    【解决方案11】:

                    这是 C++ Sigils 的魅力之一。根据我自己的个人经验,我可以在 STL 的 Arrays & Vectors 上使用取消引用运算符来保证更快、更高效的读取访问性能。如果你好奇的话,我也采用了习惯性的共享指针方法。 :)

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2020-10-05
                      • 2020-08-08
                      • 2011-05-28
                      • 2011-03-26
                      • 2012-07-12
                      相关资源
                      最近更新 更多