Function pointers in C allow a function to be called indirectly through a pointer variable rather than directly by name. A function pointer declaration specifies the return type and parameters like a normal function but with an asterisk prefixing the name. Function pointers can be assigned the address of an existing function. To call a function through a pointer, the pointer is dereferenced using asterisk or arrow notation followed by parentheses and arguments. Functions can have pointer parameters to pass references rather than values, allowing changes to persist outside the function. Function pointers provide flexibility in deciding which function to call at runtime.