Pointers are refrences to the memory where the real value is stored.
An array is a pointer to the first element of a block of memory with the array's contents.
In that way, you can use a pointer as an array(An int* pointer can be used like an int[], etc.)
You get the memory location of a value by prefixing it with &, though I don't know exactly how order of operations works with it, so I usually put &() when the part in brackets involves one or more struct value pointers(or similar).
* in a variable declaration (between the type and name) declares it a pointer(you can have a pointer to a pointer to an int type, for example, as int **var, int** var, int ** var, and likely int* *var and int**var.
When * is used outside of either multiplication or pointer declaration, it "removes" one level of pointerness, allowing editing of the contents of the pointed memory. This change does not affect the pointer itself, just how it is used in an equasion. int* a=1;*a=2; would set the value pointed to by a to 2. This is a useless example, though. Struct access of a->x is probaby identical to (*a).x {brackets likely optional, but I would rather be safe, having one extra pair that the compiler ignores than missing one and having everything mess up because of it}. Similarily, b.x is likely going to work fine as (&b)->x. It's better to use the simpler methods where possible.
Where pointers really excel, though, is functions that return struct pointers.
That FILE* (In C-style file access) is a pointer to a FILE struct(That the programmer really should never need to know the contents of, much less use directly, as visible in stdio.h's comments).
fopen() returns a pointer to a FILE struct, and everyone can be relatively happy that it all works beautifully since you don't have to bother creating and initializing an entire FILE struct by yourself.
Pointers allow you to pass along a refrence to a struct without knowing the contents(you could use a stub struct, or a void pointer to avoid even writing a full struct definition!), and allowing the later functions to EDIT THE ORIGINAL's CONTENTS. This can be a very good thing. (Why C and C++ are still popular, because it gives them a considerable portion of the power of assembly language(and speed), without the programmer having to bother with writing out individual operations.