Welcome to the forums, Ed.
First, consider the following two variable definitions. Note the location of *.
Next, understand that you're just declaring a pointer. This does not automagically create something for it to point to -- you have to do that yourself. Therefore you would need to do something like this:
card_t *(card_table); // array of 20 pointers-to-card_t
card_t (*card_table); // pointer-to-array of 20 card_t
Notice the rather complex syntax for accessing members of a structure in the array. It would be much easier to go with the malloc approaches suggested above.
card_t table; // declare an array of 20 card_t's
card_t (*card_table) = &table; // declare and define pointer-to-array of 20 card_t's
/* use it */
(*card_table).w = w; // dereference card_table to get to table,  to access the 1st structure and .w to get the w member of it