1) Pointers allow functions to modify variables in the calling function by passing the address of variables. This allows functions to return multiple values.
2) Structures can be passed to functions using pointers to avoid expensive copying of large structures. Pointers to structures use -> to access members.
3) Pointers must match the type of the variable being pointed to. Dereferencing a NULL pointer causes a program to crash. Pointers can make code more efficient by passing addresses rather than values.