(void*)&array == (void*)&array[0] // likely true
That is true by definition. The address of the first element is the same as that of the array, period. They cannot convert to different void pointers.You probably though of:
array == &array[0]
which is always true.This:
(void*)&array == (void*)&array[0]
which simplifies to: (void*)&array == (void*)array
is not.C doesn't guarantee that the values of &array and array are the same. The types T( * )[ * ] and T* are not even compatible and those two pointers are allowed to have different sizes and representation.
This relationship is also true between a pointer to a struct and a pointer to the first element. And also among pointers to the elements of a union.
In C++ you have a simple out by overloading T::operator&, allowing you to alter the result of the RHS of that equation and break it.
There's also a little bit in the standard prohibiting comparing pointers to different arrays - a leftover from the 16-bit era of near and far pointers I suspect - but that appears to only apply to relational comparisons in the C++11 standard:
http://stackoverflow.com/questions/9086372/how-to-compare-po...
I either misremember this applying to == and != as well (likely), or this changed since the C++03 standard that I'm used to referencing (unlikely). I'm also unsure if C has an equivalent rule. A fun note from that SO link:
std::less<T*>
guarantees more than operator<( T*, T* )
enabling std::map<T*,...>
et all.(edit: formatting)
A set of interesting equalities:
A pointer to an array is the address of the first element.The name of an array can be trivially and implicitly converted to the address to it's first element, but this conversion creates a (temporary) pointer, it does not make the array itself a pointer!
The array (nor it name) is not in and of itself storage for any such address, it is no pointer, and as a result &array won't give you back a pointer-to-pointer because there's no underlying 4-8 byte storage for the underlying pointer - there's no permanent pointer to point to.