You can take the addresses of variables and other data that are in memory, and functions that have had code generated for them. You can also take the address of a line of source code.
Some variables may be in registers; you cannot take their addresses.
The optimizing compilers may move variables from one memory location to another, in which case you will obtain the address of the current memory location of the variable.
The optimizing compilers may eliminate unused functions, as well as functions that have had all calls inlined. Static functions in header files may result in multiple copies of the code, and the address will be of only one of those copies.
The optimizing compilers and linkers may skip some instructions on the way in during a call, so a breakpoint on the first few instructions may not be hit. When you set a breakpoint on a function, the debugger sets it deeper in the function, at the end of the entry sequence, to try to avoid this.
The address of a line of source code is the address of the first instruction in memory that came from this line, but this instruction may be branched around, so it might not be executed before any other instruction from the same line.