First, I will answer bonus questions, because they introduce some concepts that you might need to understand the answer to the main question.
The answer to the first question about the bonus is easy if you know how the executable works: all global / static variables are inside the .data section, in which .exe stores the address offset for the section, so the Cheat Engine just checks if the variable is in this address range (from this section to the next).
In the second question, you can use only static addresses, but this is almost impossible for the game. Even the elders. What the creator of the textbook probably tried to say is that all the variables he wants actually point to them with a pointer to statics. But just because you create a local variable or even pass an argument to a function, their values are stored on the stack. This is why it is almost impossible to have a “static” program. Even if you compile a program that actually does nothing, it will probably store some things on the stack.
For the whole question, not all dynamic address variables are indicated by a global variable. It depends entirely on the programmer. I can create a local variable and never assign its address to a global / static pointer in a C program, for example. The only way to find this address in this case is to really know the code when the variable was first assigned a value on the stack.
Some variables have a dynamic address because they are only local variables that are stored on the stack when they have a value assigned to them.
Some other variables have a static address, because they are declared as a global or static variable to the compiler. These variables have a fixed address offset, which is part of the .data section in the executable.
The executable file has a fixed offset address for each section within it, and the .data section is no exception.
But it is worth noting that the offset within the executable itself is fixed. In the operating system, everything can be different (all random addresses), but this is the task of the OS, abstracting this kind of thing for you (creating in this case an executable virtual address space). Therefore, it just looks like static variables, actually static, but only inside the executable memory space. In RAM, anything can be anywhere.
Finally, it’s hard to try to explain this to you because you need to understand how executables work. A good start would be to find some explanations regarding low-level programming, for example, the stack frame, calling conventions, assembly language itself and how compilers use some well-known methods of controlling functions (areas in general), global / static / local / constant variables and the memory system (partitions, stack, etc.) and perhaps some research on PE files (and even ELF).