为什么以及何时值得使用指针指针?

时间:2010-06-21 09:15:42

标签: c++ pointers

  

可能重复:
  How do pointer to pointers work in C?

您好,

Altough我认为我在编程中通过了新手阶段我仍然有一些问题,不知怎的,我找不到他们的解释。是的,有很多“如何”超越,但几乎没有人解释为什么和/或何时有一种技术有用。

在我的情况下,我发现在某些情况下,在C ++中使用指向指针的指针。不是指向对象的指针吗?哪些好处? 应该在哪里或何时使用指向指针的指针?在这件事上我觉得有点失常。

我希望时间经验丰富的专家可以回应这些担忧,希望其他没有经验丰富的程序员可以分享。 ; - )

谢谢大家。

Julen。

7 个答案:

答案 0 :(得分:8)

嗯,这个一般性的问题很难回答。

C ++程序员的第一个答案当然是:不要在C ++中使用指针!由于你有很多比指针处理问题更安全的方法,你的目标之一是首先避免它们:)

因此在C ++中很少使用指针指针。它们主要用在C.首先,因为在C中,字符串是“char *”所以当你需要一个“指向C字符串的指针”时,你会以“char **”结尾。其次,由于在C中没有引用,当需要一个修改指针的函数或者将指针作为输出值时,需要指定一个指针参数。您通常会在分配内存的函数中找到它,因为它们为您提供指向已分配内存的指针。

如果你采用C ++方式,尽量避免使用指针,通常你有更好的方法。

MY2C

答案 1 :(得分:6)

在C中,参数通过指针传递给改变它的函数。对于旧代码或旧代码(int main(int argc, char** argv)),您将看到与C ++相同的代码,对于将从C(COM / XPCOM)访问的代码或者由用于C(或C样式)的人编写的代码

从“纯粹的C ++”角度来看,在大多数情况下使用指针指针是编码风格较差的标志,因为大多数需要**构造的情况都可以(并且应该)重构以使用更安全的替代方案(例如std::容器或*&参数)。

答案 2 :(得分:4)

我可以想到两个用例。

一个是继承自C的 数组 。在许多情况下,Arrays会自动衰减到指向其第一个元素的指针。如果你碰巧有一个指针数组,你会得到一个指向指针的指针 (当你有一个std::vector指针时会出现类似情况,顺便说一下:指针是一个完美的随机访问迭代器,我确实看到了使用std::vector<>::iterator指针的std lib实现。对于{{1}指针,std::vector将返回指向指针的指针。)

另一个是 函数参数 。对于函数参数,每个指针取一些东西表示调用者可能会调用该函数,即使它们没有传入的对象;然后他们可以通过v.begin()。 (否则为什么要使用指针而不是引用?有关详细信息,请参阅 here 。)
对指针进行非NULL引用将指示被调用函数可能为该指针分配新地址 因此,如果调用者传入指向它的指针,那么获取指针指针将指示函数可能为指针分配新地址,但也可以使用const调用。 例如:

NULL

答案 3 :(得分:3)

指针的指针在C中最相关。在C ++中,你很少需要它们。在那里,您可以使用std lib中的容器或使用引用。

C中有两个常见的用例:

  1. 一个指针数组,最突出地用作main()的argv:指针给出参数字符串数组的地址(类型为char *)。在C中,[]运算符处理指向任何事物的指针,因为指向任何东西的指针被视为与数组的等价物。

  2. 一个函数参数,表示存储某个地址的地方。用例:在C中,返回值通常用于错误处理或状态信息。参数用于承载有效载荷。一个例子:函数“返回”一个地址到新分配的内存,但使用参数。你给函数一个指向指针的指针,指针应该指向数据。该函数会覆盖该空间,为此,它需要一个指向指针的指针。

答案 4 :(得分:3)

  

应该在何处或何时使用指向指针的指针?

在一个函数中,可选地可以返回指向调用者的指针,如果调用者请求它。经常被系统API,一些COM对象等使用

int f(void** p = 0){
    //.......
}

如果调用者提供p,则函数将指针传递给p。如果调用者没有提供p,则不返回指针。在某些情况下可能对调试有用。

  

有哪些好处?

问题太宽泛了。看,这是一种非常简单的技术,没有任何神秘的好处。你需要的时候使用它。就这样。这个概念没有隐藏的意义和秘密优势 - 它等同于“在英语中使用字母\”e \“的相同之处”。

答案 5 :(得分:2)

你只能在使用手动内存管理时使用它们,这在C ++中很少见,因此它们很无用。在大多数情况下,即使是常规指针也具有可疑价值。

答案 6 :(得分:1)

实际上有两个用例。

首先,当你调用一个必须返回多个值的函数时,其中一些值是指针。然后,你会给她一个指针的地址,所以它可以填写指向的指针:

int *p1 = 0, *p2 = 0, *p3 = 0;
multi_malloc(&p1, &p2, &p3); // Allocates three pointers

其次是你想做稀疏的2d数组:

int main(int argc, char **argv)

这是指向指针的指针。 argv [i]是指向char的指针。这样,argv [i] [j]就是第i行中的char j。

您会很高兴听到指向指针的指针几乎没有用处。 int ***p;几乎没用。