title: What does *& mean in C?
body: <p>I was new to the concepts of trees. I was studying <code>Serialization</code> and <code>deSerialization</code>. I got a example program from a link, copied it, and executed it. It ran, but when I tried to understand it, I could not understand one line - <code>void deSerialize(Node *&amp;root, FILE *fp)</code></p>
  
  <p>Why is <code>*&amp;</code> mean?</p>
  
  <p>The whole code is:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #define MARKER -1
  
  /* A binary tree Node has key, pointer to left and right children */
  struct Node
  {
  int key;
  struct Node* left, *right;
  };
  
  /* Helper function that allocates a new Node with the
  given key and NULL left and right pointers. */
  Node* newNode(int key)
  {
  Node* temp = new Node;
  temp-&gt;key = key;
  temp-&gt;left = temp-&gt;right = NULL;
  return (temp);
  }
  
  // This function stores a tree in a file pointed by fp
  void serialize(Node *root, FILE *fp)
  {
  // If current node is NULL, store marker
  if (root == NULL)
  {
      fprintf(fp, "%d ", MARKER);
      return;
  }
  
  // Else, store current node and recur for its children
  fprintf(fp, "%d ", root-&gt;key);
  serialize(root-&gt;left, fp);
  serialize(root-&gt;right, fp);
  }
  
  // This function constructs a tree from a file pointed by 'fp'
  void deSerialize(Node *&amp;root, FILE *fp)
  {
  // Read next item from file. If theere are no more items or next
  // item is marker, then return
  int val;
  if ( !fscanf(fp, "%d ", &amp;val) || val == MARKER)
     return;
  
  // Else create node with this item and recur for children
  root = newNode(val);
  deSerialize(root-&gt;left, fp);
  deSerialize(root-&gt;right, fp);
  }
  
  // A simple inorder traversal used for testing the constructed tree
  void inorder(Node *root)
  {
  if (root)
  {
      inorder(root-&gt;left);
      printf("%d ", root-&gt;key);
      inorder(root-&gt;right);
  }
  }
  
  /* Driver program to test above functions*/
  int main()
  {
  // Let us construct a tree shown in the above figure
  struct Node *root        = newNode(20);
  root-&gt;left               = newNode(8);
  root-&gt;right              = newNode(22);
  root-&gt;left-&gt;left         = newNode(4);
  root-&gt;left-&gt;right        = newNode(12);
  root-&gt;left-&gt;right-&gt;left  = newNode(10);
  root-&gt;left-&gt;right-&gt;right = newNode(14);
  
  // Let us open a file and serialize the tree into the file
  FILE *fp = fopen("tree.txt", "w");
  if (fp == NULL)
  {
      puts("Could not open file");
      return 0;
  }
  serialize(root, fp);
  fclose(fp);
  
  // Let us deserialize the storeed tree into root1
  Node *root1 = NULL;
  fp = fopen("tree.txt", "r");
  deSerialize(root1, fp);
  
  printf("Inorder Traversal of the tree constructed from file:\n");
  inorder(root1);
  
  return 0;
  }
  </code></pre>
  
  <p>Any help appreciated.</p>