A pointer is a variable that stores the address of another variable. It can point to variables of types like int, char, arrays, functions, or other pointers. The '&' operator returns the address of a variable, and the '*' operator accesses the value at a particular address, also called indirection. Pointers allow direct access to memory, passing multiple return values from functions, reducing storage space and complexity, and dynamic memory allocation through malloc and free.