Pointers
A pointer is just a variable that stores a memory address instead of a value. That's it, everything else about pointers is a consequence of that one idea.
&xpis the address-of operator, "give me the memory address wherexplives".int *xpPtrdeclaresxpPtras "a pointer to anint".*xpPtris the dereference operator used on an existing pointer, "go to the address this pointer holds, and give me (or set) the value there".
Why bother?
Without pointers, C functions can only work with copies of the arguments you pass in:
Passing a pointer lets a function reach back into the caller's memory and modify it directly, this is how C simulates "pass by reference" since it only ever passes values (and an address is just a value).
WARNING
A pointer that doesn't point at valid memory (never initialized, or freed already) is called a dangling pointer. Dereferencing one is undefined behavior, it might crash, or worse, silently corrupt unrelated memory. Always initialize pointers, even to NULL.