Pointers allow programs to manipulate values indirectly through memory addresses. Pointers are declared with a data type followed by an asterisk, such as int*. A pointer stores the address of another variable in memory. The asterisk operator is used to dereference a pointer and access the value stored at that address. Pointers can be passed as arguments to functions and used to return values. Arrays names are pointers to the first element. Recursion solves problems by breaking them down into subproblems and calling the function repeatedly until a base case is reached. Examples of recursive functions provided are calculating factorials and generating Fibonacci sequences.