title: What does ** mean in C?
body: <p>I have a sample <code>C</code> program I am trying to understand. Below is a function excerpt from the source code:</p>
  
  <pre><code>double** Make2DDoubleArray(int arraySizeX, int arraySizeY)
  {
    double** theArray;
    theArray = (double**) malloc(arraySizeX*sizeof(double*));
    int i = 0;
  
    for (i = 0; i &lt; arraySizeX; i++)
      theArray[i] = (double*) malloc(arraySizeY*sizeof(double));
  
    return theArray;
  }
  </code></pre>
  
  <p>My question is what is the significance of the <code>**</code> in the return type. I know that the <code>*</code> is generally used as a <code>pointer</code>. I know that it may also be used to <code>dereference</code> the pointer.</p>
  
  <p>This makes me think that <code>double**</code> is a double value because it is essentially the dereferencing of a reference. Is my thinking correct? If not, can someone please explain the use of <code>**</code> in this example? </p>