Pointer is a variable that stores the address of another variable. Pointers allow indirect referencing of values and are useful for returning multiple values from functions, dynamic memory allocation, and building complex data structures like linked lists. Pointers are declared with a data type followed by an asterisk and are initialized with the address of another variable. The address-of operator & returns the address of its operand, while the indirection operator * accesses the value at the address stored in the pointer. Pointers can reference values indirectly, be passed by reference to functions to modify caller's variables, and implement call by reference parameter passing in C.