Doesn't a 2D array decay to pointer to pointer
Up till now I was pretty much sure that
int arr[4][5];
Then arr
will decay to pointer to pointer.
But this link proves me wrong.
I am not sure how did I get about arr
being pointer to pointer but it seemed pretty obvious to me. Because arr[i]
would be a pointer, and hence arr
should be a pointer to pointer.
Am I missing out on something.
Solution 1:
Yep you are missing out on a lot :)
To avoid another wall of text I'll link to an answer I wrote earlier today explaining multi-dimensional arrays.
With that in mind, arr
is a 1-D array with 4 elements, each of which is an array of 5 int
s.
When used in an expression other than &arr
or sizeof arr
, this decays to &arr[0]
. But what is &arr[0]
? It is a pointer, and importantly, an rvalue.
Since &arr[0]
is a pointer, it can't decay further. (Arrays decay, pointers don't). Furthermore, it's an rvalue. Even if it could decay into a pointer, where would that pointer point? You can't point at an rvalue. (What is &(x+y)
? )
Another way of looking at it is to remember that int arr[4][5];
is a contiguous bloc of 20 int
s, grouped into 4 lots of 5 within the compiler's mind, but with no special marking in memory at runtime.
If there were "double decay" then what would the int **
point to? It must point to an int *
by definition. But where in memory is that int *
? There are certainly not a bunch of pointers hanging around in memory just in case this situation occurs.
Solution 2:
A simple rule is:
A reference to an object of type array-of-T which appears in an expression decays (with three exceptions) into a pointer to its first element; the type of the resultant pointer is pointer-to-T.
When you deal with 1D array, array name converts to pointer to first element when passed to a function.
A 2D array can be think as of an array of arrays. In this case int arr[4][5];
, you can think arr[]
as an array name and when passed to a function then converts to a pointer to the first element of array arr
. Since first element of arr
is an array, arr[i]
is a pointer to i
th row of the array and is of type pointer to array of 5 int
s.