A variable is just an abstraction. It is the idea of a named value that you can refer to, read and (sometimes, depending on its type) modify.
Where it is stored in the hardware is just an implementation detail. Often, they are implemented by storing data at a certain memory address, and then using that address whenever the variable is to be accessed, so in that sense, it is often an "automatically dereferenced pointer" as you say.
But sometimes, a variable is stored in a register instead of in memory. Then it doesn't have an address, and you can't create pointers to it.
Sometimes, it may not even exist in the compiled code. Sometimes the compiler might transform the code so the variable is no longer necessary, or the variable might be converted to a single compile-time constant.
Ultimately, variables only exist in the source code. Once your code is executing, variables no longer exist. Some variables are converted into memory locations, and some are removed entirely, or transformed into something you wouldn't even recognize as a variable.
For example, this code:
int x = 10;
y += 10;
could be compiled by representing x and y as memory locations, and then the addition is performed with an instruction such as "add the value from memory address x to the value at memory address y".
But the compiler could also encode the constant 10 into the instruction itself, generating an "add 10 to the value at memory address y" instruction. Sure, x
was a variable in the original source code, but it's no longer a memory location. It's encoded directly into the instruction stream.