"Pointers make my head spin" etc ...

Robin2:
OK. Then my question is why didn't they make it so that the same shortcut works with the simple variable myVar? (i.e. so the & is not needed)

This has been covered fairly extensively above, but to summarize:

the standard conversion for arrays is needed to access array elements. This is because the subscripting operator works with pointers (not actually an array specific operator)

The expression E1[E2] is identical (by definition) to *((E1)+(E2))

Its identical form (second one listed above) shows that either E1 or E2 must be a pointer as it is dereferenced to access the value.

The code below is accessing the second element of the array two different ways using the subscripting operator, showing that at least one operand must be a pointer:

int array[5];

int a = array[1];

int b = 1[array];




So even though an implicit array to pointer conversion may seem strange, **it is in fact needed to access elements of arrays**.
...
An **array is [u]unrelated[/u] to 'ordinary' variables**, and it has its own features just as primitive types have their own standard "integral conversions".
...
And why does an 'int' not do casting like this by default? Well that is because it **does not make sense**, is illogical, and is **unrelated to an array**.
...
There are no inconsistencies here. I'm confused as to why you trying so hard to connect two [u]**unrelated**[/u] things.
...
These aren't inconsistencies, its **a flawed approach comparing two dissimilar things**.

And one more to the pile from Whandall:

There is no shortcut in the myVar case, because there is no myVar[0].

So as you can see, there is no array logic in 'simple' variables, because they aren't arrays. The array functionality is there because it is required, as I have mentioned above.

Your shortcut that you cannot understand why it isn't available to a standard variable makes no sense, why, because the choice is ambiguous: Do you return a pointer, or the actual int. With an array id (without subscript) all you have is a pointer to the first element, as an array reference and array pointer are not compatible and ignored.