I'm guess you have some C++ experience? You're doing two things you may wish to avoid. Structs are bad, refs are bad; never use them again.

Or, rather, you never have to use them unless you're talking to some external DLL COM+ mess. For your own stuff, there's never really any need. Also, all those arrays... collections are your friend, even in C++.
Every State struct in the array points to the same instance of VisibleCards, so if you say:
CODE
gs[0].visibleCards.cardsInPlay = new Card[4];
The rest of the your gs[x].visibleCards will reflect the change, as you've stated it. However, if you should say something like:
CODE
gs[1].visibleCards = new VisibleCards();
You will be referencing a different instance in that one element. Hope that makes sense.