Pointers are variables that store memory addresses and allow indirect referencing of values in memory. They can be declared and initialized, with operators like & to get the address of a variable and * to dereference a pointer and access the value at a memory address. Pointers are useful for passing arguments by reference to functions to allow the function to modify the original variables, and for accessing elements in arrays by their offsets from the base address. Pointer arithmetic allows treating pointers like integers to advance through contiguous blocks of memory.