Pointers allow programs to store and pass around memory addresses. Pointers in C can point to primitive data types, arrays, structs, and other pointers. Declaring a pointer requires a * before the pointer name and specifying the type of data it will point to. The & operator returns the memory address of a variable, which can be stored in a pointer. The * operator dereferences a pointer to access the data being pointed to. Pointers enable functions to modify variables in the calling function and return multiple values. They also make structs more efficient to pass to functions. Care must be taken to avoid bugs from misusing pointers.