For arrays, a pointer means exactly the same as for everything else.
A pointer points to the location of exactly one object (in reply to unwind's pointer-to-array objection: this one object may also be an array), no more no less. It does not know the size of an array-of-objects if there is one (and doesn't care).1
It is perfectly possible to create a pointer to a single value and access it as an array of some size, although that is neither well-defined nor wise (it will probably crash). It is also perfectly possible to use a pointer to an array of size 5 and access the 10th element. Again, this doesn't make sense and will probably crash, but nothing prevents you from doing it (except with compiletime-constant indices, at least some compilers may warn). The pointer does not know.
For a structure, a pointer knows the structure's location in memory, no more and no less. On top of that, the compiler knows additional details such as the offset of members to this base address. This information is however bound to the type that you use to dereference the pointer (not to the pointer itself!).
It is therefore generally possible to access a Car
object through a Banana
pointer, if you get your Banana
to point at a car (by cast, by accident, or by arithmetic). Of course that doesn't make any sense, but it's possible. The pointer does not know a difference, and the compiler will act "as if".
1 Yes, if it's a pointer-to-array, the compiler knows the size of
that array. But that only matters for type correctness. You'll get a compile error trying to assign an array-of-5 to a pointer-to-array-of-4, because they're different things. But that is irrespective of the pointer. The
pointer still does not know the size of the array, and it still does not know whether there is one array or an array-of-arrays. You can still use it either way (probably to desastrous effect), and there is no logic that prevents you from doing harm.