In the source code, in some contexts, variables of different types are compatible in a given expression and the compiler will invoke sufficient magic to do the right/expected thing, for instance passing an array as an argument to a function expecting a pointer.
However that does not mean that the memory layout of those are compatible. See question
Pointer vs array in C, non-trivial difference where I missed on that.
I an not quite sure what your book means by "structural equivelance", but wonder if that maybe refers to the default integer promotion (but seems to also include arrays?). But in any case integer promotion is a very important issue and you should invest time in understanding. The printf below shall be executed in accordance to those rules:
unsigned int i = 0;
if (i < -1) {
printf("This line is printed!\n");
}
The C standard (ISO/IEC 9899:1990) contains a section with title "usual arithmetic conversions" defining the behaviour. The standard is not freely available (on the contrary it is sold rather expensively since ISO standards are priced per page...), but if you search for that term you should be able to find some useful information or quotes. Some of the drafts of the standards are freely available, however threat those with a large amount of distrust since you do not know exactly what were changed to the final standard.