 <p><em>p, just p, no asterisk, no brackets</em> gives the address of the first element of the array <code>p[]</code>. <code>*p</code> on the other hand gives the value of the first element of the array <code>p[]</code>, which happens to be the address of the first element of the array <code>n[]</code>, according to the code you show.</p> <hr> <p>Lets take an example, assuming an integer is of size 4 bytes and an address if of size 8 bytes, and the first program that you showed.</p> <pre><code>int n[5] = {1,2,3,4,5}; int *p[5]; for(i = 0; i &lt; 5; i++) { p[i] = &amp;n[i]; } </code></pre> <p>The arrays would look something like this.. (addresses are assumed for explanation purpose, they are not real).</p> <pre><code>n[] = { 1, 2, 3, 4, 5}; //these are integers // ^ ^ ^ ^ ^ // 100 104 108 112 116 these are the addresses of the elements of array n[] p[] = { 100, 104, 108, 112, 116}; // these are pointer to integers // ^ ^ ^ ^ ^ // 200 208 216 224 232 these are adddress of the elements of array p[] </code></pre> <p>Now, <em>p, just p, no asterisk, no brackets</em> would give the value <code>200</code>, which is the address of the first element of the array <code>p[]</code>. </p> <p>Like wise <code>n</code> would give the value <code>100</code>. </p> <p><code>*p</code> would give the value <code>100</code> which is the element stored in the first position of the array <code>p[]</code>.</p>