As a thought experiment, I wonder what would happen if you took the reverse approach. Only teach pointers right from day 1. You want to read two numbers and add them? Well, make 2 int*'s, new them both, read their values, print the result, then delete them. You wouldn't have to explain what the news and deletes were for, similar to how you don't really explain why you have to type int main(int argc, char **argv) to someone starting out. Just say that's how you make variables. Then, 3 months down the line, say "oh, by the way. Here's a neat little trick. If you don't use the *, you can skip all that new / delete stuff".
Reminds me of the way I was taught calculus. You learn derivatives the "hard way" with differential forms, then they teach "oh yea, you can actually just subtract 1 from the exponent and multiply by the coefficient".
This is genius. I am a big fan of learning things the hard way. Always. It's my number 1 gripe with my CS program. The stuff I wanted and was ready to do, was the stuff it took until my junior year to get to. These programs are designed just as farming houses to produce java monkeys, and I have hated it since the beginning. They also teach you a bunch of algorithm theory before you even touch systems programming, so you don't have a good hands on way of practicing the theory that you learn.
I still don't know how to distribute a java project to anyone that doesn't have the jdk and same ide installed. The tendency to lean on abstraction is a crutch that I feel only hurts developers from full learning the foundation of what they are using.