在C/C+;中使用双指针有什么好处+; 我对C/C++是新的。< /P>

在C/C+;中使用双指针有什么好处+; 我对C/C++是新的。< /P>,c++,c,pointers,C++,C,Pointers,我正在研究一些与树相关的编码问题,遇到了这个双指针表示法。在下面的函数中,我们可以使用单指针作为第一个参数,就像使用双指针一样 void operate(struct Node *root, struct Node **head_ref){ //do something} 有两种解释指针的方法;对某物或数组的引用。考虑到这是一个树,这可能是第一个:对另一个指针的引用 C中函数的每个参数都是按值传递的,这意味着如果在函数内部更改指针,则在函数外部不会更改指针。为了保证它也在外部更改,您可以使用对

我正在研究一些与树相关的编码问题,遇到了这个双指针表示法。在下面的函数中,我们可以使用单指针作为第一个参数,就像使用双指针一样

void operate(struct Node *root, struct Node **head_ref){ //do something}

有两种解释指针的方法;对某物或数组的引用。考虑到这是一个树,这可能是第一个:对另一个指针的引用

C中函数的每个参数都是按值传递的,这意味着如果在函数内部更改指针,则在函数外部不会更改指针。为了保证它也在外部更改,您可以使用对指针的引用:双指针。你可以考虑下面的例子。

void function(int a) {
    a = 5;
}
即使上面更改了
a
,也不会在功能之外更改。但在另一种情况下

void function(int * a) {
    *a = 5;
}

a
也在函数外部更改。同样的思想过程也可以应用于指针(它也是一个值)。

当您希望函数处理malloc时,free是主要原因

如果您想封装内存分配,这很有用

例如,一些init(struct some_struct**)、free(struct some_struct**)。 让函数处理malloc,free。而不是在堆栈上分配

例如,打包长度未知的字符串的函数

   size_t pack_struct(char** data, const struct some_struct * some_struct)
   {
   /**
    * @brief buffer
    * @note verify the needed buffer length
    */
   char buffer [256]; // temporary buffer

   *data = 0;

   //const char* package_pattern = "%cW ;%u.%u;%s%c";
   size_t len = sprintf(buffer,  weight_package_pattern,
                    START_CHARACTER,                    
                    some_struct->ts.tv_sec,
                    some_struct->ts.tv_usec,
                    some_struct->string_of_unknown_length, // but no more then buffer
                    STOP_CHARACTER);

  if(len == 0) {
    perror("sprintf failed!\n");
    return len;
   }

  // len++; // for end character if wanna some, see sprintf description

  *data = (char*)malloc(len*sizeof(char)); // memory allocation !
  strncpy(*data, buffer, len);

  return len;
}

但是,在C++编程中应避免使用这种技术。

在分配内存时通常使用双指针。

#include <stdlib.h>
void new_malloc(void **p, size_t s) {
    *p = malloc(s);
    /* do something */
}

int main() {
  int *p;
  new_malloc((void **)&p, sizeof(int) * 10);
}
#包括
作废新材料(作废**p,尺寸){
*p=malloc(s);
/*做点什么*/
}
int main(){
int*p;
新马洛克(无效**)和p,规模(内部)*10;
}

Read Say it
pointer to pointer
不是
double pointer
,double是一种数据类型,它的好处是为2d/3d数组分配内存是的,二维数组也可以表示为指针。