seems like the arguments for "for" are executed first and then the loop body. so:
the first element is $e && 0 which evaluates to $e. then the second argument is processed, autovivify happens.
when in the loop body, $e is an array reference already, and because the first element is an alias to $e it prints ARRAY(0xde0d48). seems logical to me.
I don't see your example as a proof for that.
argument 1: $x=0 $x is set to 0 and $x (or an alias) is passed as argument 1
argument 2: $x=$x+1 $x is set to 0+1 = 1 and $x (or an alias) is passed as argument 2
argument 3: $x++ $x is incremented and the return value of the post increment (1) is passed as the argument 3
argument 4: ++$x $x is incremented and the return value of the pre increment (3) is passed as argument 4.
$x is now 3.
argument 1 is an alias for $x. 3
argument 2 is an alias for $x. 3
argument 3 is 1.
argument 4 is 3.