Pointers provide references to memory locations in a program. They are used to pass variables by reference, access array elements, and dynamically allocate memory. A pointer variable contains the address of another variable. The address (&) operator returns the memory address of a variable. The indirection (*) operator accesses the value of the variable a pointer is pointing to. Pointers allow modifying variables passed to functions and returning addresses from functions. Memory is dynamically allocated using functions like malloc(), calloc(), and realloc() and freed using free(). Multidimensional arrays can be dynamically allocated by allocating an array of pointers and having each pointer point to a 1D array.