Pointing the Way

So now that we know what pointers are, how do we create and use them? Remember, a pointer is a variable just like any other. So, in C, we must declare our pointer variables. A pointer to a character would be declared like:
char *p;

which means to define a variable called p which will normally hold the address of some character. The syntax is meant to indicate the the expression *p should be a character. In fact, that identifies the first aspect of using pointers. The * operator dereferences a pointer, which means that the value of the expression *p is the character to which p points. For example, the code fragment
*p = 'b';
printf("%c\n", *p);

would set the character to which p points to be the character 'b' and would then print it out. This illustrates that a dereferenced pointer may be used anywhere any other variable or expression of that type may be used.
Which of these are valid pointer (variable) declarations?

int *q;

float **p;

char *names[100];

char *names[];