You got it slightly wrong: moreThings
also decays to a pointer to the first element, but since it is an array of an array of chars, the first element is an “array of 8 chars”. So the decayed pointer is of this type:
char (*p)[8] = moreThings;
The value of the pointer is of course the same as the value of &moreThings[0][0]
, i.e. of the first element of the first element, and also the same of &a
, but the type is a different one in each case.
Here’s an example if char a[N][3]
:
+===========================+===========================+====
|+--------+--------+-------+|+--------+--------+-------+|
|| a[0,0] | a[0,1] | a[0,2]||| a[1,0] | a[1,1] | a[1,2]|| ...
|+--------+--------+-------+++--------+--------+-------++ ...
| a[0] | a[1] |
+===========================+===========================+====
a
^^^
||+-- &a[0,0]
|+-----&a[0]
+-------&a
-
&a
: address of the entire array of arrays of chars, which is achar[N][3]
-
&a[0]
, same asa
: address of the first element, which is itself achar[3]
-
&a[0][0]
: address of the first element of the first element, which is achar
This demonstrates that different objects may have the same address, but if two objects have the same address and the same type, then they are the same object.