A pointer is a variable that stores the memory address of another variable. Pointers allow indirect access to the data in memory. Pointer variables must be declared with a data type followed by an asterisk. This indicates they will store addresses. The ampersand (&) operator returns the address of its operand. The asterisk (*) operator accesses the value at the address stored in a pointer. Pointers can be assigned, compared, converted between types, and used in pointer arithmetic. Arrays of pointers store addresses, allowing a collection of memory locations to be accessed indirectly. A double pointer is a pointer variable that stores the address of another pointer.