In your example, all the instances are allocated at once - all items zero to 99 inclusive are valid. If you used a type with a constructor, all 100 would be constructed.
EDIT - as others have noted, just because it's constructed doesn't mean anything has been initialised. The default constructor for "int" leaves it untouched (it's your job to initialise it to whatever you want). The default constructor for "struct" calls the constructors for its members. That is, constructing doesn't mean much here - but the memory is allocated and ready for you to (initialise and) use.
The first uninitialised "part of the array" isn't a part of the array - it's going out of bounds. For example...
Coordinate mistake = places [100]; // Above the upper bound
This is "undefined" behavior. You may get an crash (some kind of memory-related exception from the processor). Your program may carry on happily working, ignorant of the fact that it's using invalid junk data. In the above case, since what's happening is fairly obvious, you'll probably get a compiler warning - but that won't generally be the case.
If you write to an out-of-bounds array index, you may be corrupting other variables or the return address of your function or just about anything, so the behavior of your whole program from that point onwards is undefined. This is the basis of one of the largest whole classes of security flaws and "exploits".
An std::vector is another way of creating arrays. It doesn't allocate all items immediately - it's a dynamic array that allows for (and manages) resizing. However, it won't catch out-of-bounds indexes any more than the basic C-style array will.
struct Coordinate {...};instead. This defines a type calledCoordinatein C++.