"->" vs "." to access class members?

The benefit of using "Class *c = new Class()" and access members with "c->what()" is that the memory occupied by that object can be released with "delete c" - if you make a static allocation "Class c" and access it with "c.what()", the memory it occupies cannot be released.

Yes you can declare arrays of structs or classes. In fact, the only difference between "class" and "struct" is that in a struct the members (variables) are public by default whereas they are private in a class.

NOTE: Arduino has a very crude memory management. Whenever it is possible, use static declarations. You should not use dynamic memory (allocate and release) since it may cause memory fragmentation leading to corruption and eventually a "crash" where the sketch/device becomes defunct until it is being reset.