何时将指针的指针作为参数传递给C ++中的函数?

这个问题在这里已经有了答案:

  • 在C ++中通过引用传递指针会带来什么好处? 6个答案

  • C ++

    在C ++中,你可以通过引用传递,而当你想要修改参数来影响调用者传入的参数时,你可以这样做。也就是说,通过引用传递代表out或in / out参数。

    如果函数想要一个指针(显然),或者如果您想要表示一个可选的输出参数,则传递一个指针 - 因为引用总是必须绑定到某个对象,但指针可以为null。

    通过相同的逻辑,如果函数实际需要双指针(在C ++中非常少见),或者如果要表示指针类型的可选[in] out参数(也很罕见),则将指针传递给指针。

    这里有一些例子(做作,但应该证明这件事):

    int square(int x)  //pass int by value
    { return x * x; }
    
    void squareRoots(double in, double &plus, double &minus)  //pass double by reference
    {
      plus = sqrt(in);
      minus = -plus;
    }
    
    int toNumber(String s, bool *ok = nullptr)  //optional out parameter
    {
      try {
        int val = s.toNumber();
        if (ok)
          *ok = true;
        return val;
      } catch (NotANumber &) {
        if (ok)
          *ok = false;
        return 0;
      }
    }
    
    int computeAge(Person *person)  //pass pointer by value
    {
      if (!person)
        return -1;
      else
        return now() - person->dateOfBirth();
    }
    
    bool createPerson(Person * &person)  //pass pointer by reference
    {
      if (tooManyPeople())
        return false;
      person = new Person();
      return true;
    }
    
    int sum(int **values)  //pass double pointer by value
    {
      if (!values)
        return 0;
      int res = 0;
      while (*values) {
        res += **values;
        ++values;
      }
      return res;
    }
    
    bool allocate(int ** &arr)  //pass double pointer by reference
    {
      if (!enoughMemory())
        return false;
      arr = new int*[1024];  // array of 1024 pointers to int
      return true;
    }
    
    bool newNode(Node **node = nullptr)  //optional out parameter
    {
      Node *added = dataStructure.createNode();
      if (node)
        *node = added;
      return added;
    }
    

    (注1:我只是在这里谈论非const引用,因为这与通过指针传递和传递引用相关。通过const引用传递通常意味着“对象太大而无需复制”,而不是适用于指针可能涉及的指针)。

    (注意2:上面的例子很糟糕,因为它们使用拥有原始指针,动态数组分配等等。在实际的C ++中,你会使用智能指针, std::vector等等。这就是为什么指针指针在C ++中很少见的原因) 。


    C

    在C中,双指针更常见,因为C没有引用类型。 因此,您还使用指向“通过引用传递”的指针。 在上面的C ++示例中的参数类型中使用& ,将在C中使用* (并在操作参数时解除引用)。 一个例子:

    void squareRoots(double in, double *plus, double *minus)  //pass double "by reference"
    {
      *plus = sqrt(in);
      *minus = -*plus;
    }
    

    void SomeFun1(int *);
    void SomeFun2(int **);
    int i;
    int *ptr = &i;
    
    //when you want value of ptr should remain unchanged, but you want to change only value of i, use,
    SomeFun1(int *)
    
    //when you want value of ptr should change. i.e, it should point to some other memory other than i, use,
    SomeFun2(int **);
    

    当您希望函数设置指针的值时,您将指针的指针作为参数传递。

    当函数想要分配内存(通过malloc或new)并在参数中设置该值时,您通常会执行此操作 - 然后调用方负责释放它。 它比返回它作为函数的返回值要好,因为调用者不可能错误地忽略返回值,并且通过不释放它而导致泄漏。

    如果您要返回多个值,您可能还想使用它。

    做这件事的另一个原因是当你想让任意返回值(即指向指针的指针可以是NULL)。 例如,看看strtol()它有一个可选的endptr。

    注意:你不应该把这个指针设置为堆栈变量。

    链接地址: http://www.djcxy.com/p/20717.html

    上一篇: When to pass a pointer to pointer as argument to functions in C++?

    下一篇: Pass by Reference v. Pass by Pointer