What does ** do in C language?
<p>I'm new to C with a good background in java and I'm trying to understand pointers and arrays.</p>
<p>I know that subscript <code>operator[]</code> is part of an array definition, so:</p>
<pre><code>int numbers[] = {1,3,4,5};
</code></pre>
<p>would create a integer array, which would be represented in memory as 16 bytes, 4 lots of 4 bytes:</p>
<pre><code>numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28
</code></pre>
<p>However, when it comes to pointers my knowledge starts to break down, so if I was to create a pointer to the array numbers I would do the following:</p>
<pre><code>int *pNumbers = &amp;numbers[0];
</code></pre>
<p>which would look something like this:</p>
<p><a href="https://i.stack.imgur.com/pBoFj.png" rel="noreferrer"><img src="https://i.stack.imgur.com/pBoFj.png" alt="pointer to numbers" /></a></p>
<p>And I'm guessing it would be of size 4 bytes?</p>
<p>However the <code>**</code> I read as &quot;pointer to a pointer&quot; which makes no sense to me, why would anyone want a pointer to a pointer, surely if a-&gt;b-&gt;c then a-&gt;c would suffice? I know I'm missing something, and it must have something to do with arrays as <code>argv</code> can be of type <code>char[ ]</code> or <code>char **</code> as seen bellow:</p>
<pre><code>int main(int argc, char **argv){}
</code></pre>
<p>So:</p>
<ul>
<li>what is this (<code>**</code>)?</li>
<li>what use does it have?</li>
<li>how is it represented in memory?</li>
</ul>