As already stated a pointer is simply a region of memory that can be referenced that holds the address of another location in memory (or the 'heap' to be more precise) that contains actual data. An array on the other hand is an aggregate data type meaning that it contains a collection of elements (individual cubbyholes of the same data type) normally in contiguous regions of memory. The first element of the array is the pointer to the beginning of the structure. Let's put all of this into some code.
Pointer
There are multiple ways that pointers can be used depending on how flexible you want them to be. The simplest way is to have a pointer point to a variable, say
int a = 1;
int* a_ptr = &a;
int b = *a_ptr; /* b is initialized to 1 via the pointer to a. */
Array
An array, on the other hand is also a very simple concept. Bare in mind that the address of the first element in the array is the stating address of the overall structure.
When we access an array we use the conventional notation:
int someArr[3] = {0, 2, 4};
someArr[0]; /* 0 */
someArr[1]; /* 2 */
someArr[2]; /* 4 */
but we can also use the regular pointer dereferencing syntax to access an array:
*(someArr); /* 0 */
*(someArr + 1); /* 2 */
*(someArr + 2); /* 4 */
which clearly exposes how closely related arrays are to pointers. As an explanation of the last section of code:
*(someArr + n) where 'n' is the number of bytes of array type that is advanced in memory to retrieve the value pointed to, so:
*(someArr + n) is the same as *(someArr + (n * [size of array element type])) to find the value of array element 'n'.