I think the overwhelming trend is taking the emphasis
off where the variable is stored in memory. The first major step towards this is virtual memory which is obviously designed to make the true memory location irrelevant.
The second is variables as symbols. You declare "int c = 3;" and you don't give a crap what the virtual address of c is. This would be in contrast to saying something like "0x00ff = 3", in which case you need to know exactly what the address is. Granted, for a language like C it is still crucial to understand the difference between the stack and the heap but you could argue that that is just a limitation of the language (but I won't argue that, for fear that all the xml-hatin unix programmers will come kick my ass

).
Third step: when you get to a higher level language the need to understand this is largely alleviated, especially for a language with a garbage collector. I'll use java because that's what I know best. In java only primitives and references are stored on the stack and since you can never use references to primitives or references to references you will never have a reference or variable go wrong. Hence, you don't technically need to know the difference between the stack and the heap. Contrast that to C and trying to return a pointer to a local int: that reference becomes invalid as soon as the method returns.
The less you need to know about memory addresses, the easier programming gets. Let the hardware/operating system/compiler/runtime environment take care of it for you. I'm not advocating not learning about memory addresses, that's still beneficial, but the less the logic of your program is concerned with it the better.