Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么和什么时候值得使用指针对指针?_C++_Pointers - Fatal编程技术网

C++ 为什么和什么时候值得使用指针对指针?

C++ 为什么和什么时候值得使用指针对指针?,c++,pointers,C++,Pointers,可能重复: 你好, 虽然我认为我已经通过了编程的新手阶段,但我仍然有一些问题无法解释。是的,这里有很多“怎么做”,但几乎总是没有人解释为什么和/或何时一种技术是有用的 在我的例子中,我发现在某些情况下,指针的指针在C++中使用。指向对象的指针还不够吗?有哪些好处?应该在何处或何时使用指向指针的指针?在这件事上我感到有点不知所措 我希望有时间经验的专家能够对这种担忧做出回应,希望其他没有经验的编程人员也能这样做 谢谢大家 朱伦。实际上有两个用例 首先,当您调用一个必须返回多个值的函数时,其中一些

可能重复:

你好,

虽然我认为我已经通过了编程的新手阶段,但我仍然有一些问题无法解释。是的,这里有很多“怎么做”,但几乎总是没有人解释为什么和/或何时一种技术是有用的

在我的例子中,我发现在某些情况下,指针的指针在C++中使用。指向对象的指针还不够吗?有哪些好处?应该在何处或何时使用指向指针的指针?在这件事上我感到有点不知所措

我希望有时间经验的专家能够对这种担忧做出回应,希望其他没有经验的编程人员也能这样做

谢谢大家


朱伦。

实际上有两个用例

首先,当您调用一个必须返回多个值的函数时,其中一些值是指针。然后,您将为她提供一个指针的地址,以便它可以填充指针:

int *p1 = 0, *p2 = 0, *p3 = 0;
multi_malloc(&p1, &p2, &p3); // Allocates three pointers
第二个是当您要执行稀疏二维阵列时:

int main(int argc,char**argv)

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


您会很高兴听到指针对指针几乎没有任何用途<代码>国际***p几乎从来都不有用。

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

不过,在C中有两种流行的用例:

  • 指针数组,最常用作argv to main():指针为参数字符串数组(类型char*)提供地址。在C语言中,[]运算符处理指向任何对象的指针,因为指向任何对象的指针被视为数组的等价物

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


  • 在C语言中,一个参数通过一个指针传递给一个改变它的函数。对于C或COM(或COM/XPCOM),您将看到与C++相同的旧代码或遗留代码(<代码> int main(int ARC,CHAR**ARGV) >)。
    从“纯C++的角度来看,使用指针指向指针在大多数情况下都是糟糕的编码风格的标志,因为大多数需要
    **
    构造的情况都可以(而且应该)进行重构,以使用更安全的替代方案(如
    std::
    容器或
    *&
    参数)。

    ,要回答这样一个笼统的问题有点困难

    < C++程序员的第一个答案肯定是:不要在C++中使用指针!由于您有许多比指针更安全的方法来处理问题,因此您的目标之一是首先避免它们:)

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

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


    my2c

    我可以想到两个用例

    一种是继承自C的数组。在许多情况下,数组自动衰减为指向其第一个元素的指针。如果您碰巧有一个指针数组,则会得到一个指向该数组指针的指针。
    (当你有一个
    std::vector
    指针时,也会发生类似的事情,顺便说一句:指针是一个完美的随机访问迭代器,我确实见过std-lib实现使用
    std::vector::迭代器的指针。对于
    std::vector
    指针,
    v.begin()
    将返回指向指针的指针。)

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

    void f(int** ppi);
    void g(int i);
    
    void h()
    {
       f(NULL); // call `f()` only for its side-effects
    
       int* pi = NULL;
       f(&pi);  // call `f()` and get some object in *pi
       if(pi) 
         g(*pi); // use result
    }
    
    应该在何处或何时使用指向指针的指针

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

    int f(void** p = 0){
        //.......
    }
    
    若调用者提供了p,那个么函数将指针传递给p。若调用方不提供p,则不返回指针。在某些情况下,可能有助于调试

    有哪些好处


    这个问题太宽泛了。看,这是一种非常简单的技术,没有什么神秘的好处。你在必要的时候使用它。这就是全部。这个概念没有隐藏的意义,也没有秘密的好处——它相当于问“在英语中使用字母“e”有什么好处”

    您仅在使用手动内存管理时使用它们,