 <p>The key components here are that the index operator returns y<a href="https://i.stack.imgur.com/XfzCs.png" rel="nofollow noreferrer">1</a> an actual int not an address. The same for the dereference operator *(x + 2).</p> <pre><code>int a = y[1]; // a = the value of the int after y[0] int b = *(x + 2); // b = the value of x[2] note that the index operator is just shorthand, y[1] just means *(y + 1) // int* c = y[1]; NOT LEGAL assignment of an int to an int* // int* d = *(x + 2); NOT LEGAL assignment of an int to an int* </code></pre> <p>I've added a table here to hopefully help clarify: <img src="https://i.stack.imgur.com/XfzCs.png" alt="tabel"></p>