My point is that teaching someone that pointer arithmetic is possible in C++
is a good point to make, but
not also teaching them that it's undefined except under some very specific purposes is dangerous; you wouldn't want people to go away with the idea that "hey, we can perform all sorts of arithmetic on pointers, cool!". Or at least, you also want them to know: except in these cases, doing it may or may not work and we can't be sure.
Giving somebody the tools to shoot their own foot off is often desirable, but it's nice to mention how the safety works at the same time
Same sort of idea applies with the pre-post increment operators: in my mind, the most important point to make with these under virtually
any circumstances is that once you use two or more on the same variable between sequence points, the results are undefined. Not "well, it actually only does it once", but literally undefined.
(I should probably mention that the reason I feel so strongly about this is I'm currently porting our code base at work from Win32 to .NET and I've been bitten a few times by code where the person who wrote it just checked "does it work on the compiler
I'm using", rather than "is this meant to work at all".)
The main reason I'm mentioning funky pointers containing non-address information is that, hey,
I find that information kind of cool - how many people thought pointers were always just integers, a raw 'count' of bytes? It's sort of enlightening to realise "well,
my PC does that, but..."
It's yet another thing I see people assuming all over the place, "well, pointers are just integers, right? I can just convert it to an integer and back again and it's just an address in memory..." - ie. they know enough to make it work
some of the time...