I was typing a response when Moggy sent you to bed.
Anyways, I see what you did there. I said that it's not that complicated, and you are showing that it can in fact be quite so. I know it makes no difference whether the example used a char* or void*, I was just stalling for time while I ran off to my compiler. In my head I was going okay the array is implicitly dereferenced and then you are casting to a char*, but you're not because of the extra set of parens. So you are just casting the "i", but if it was already declared of type char* that that makes no difference, or does it... ARGHHH *runs off to compiler*.
So if an array of chars i[3] contains "A" at i[2], then ((char*)i)[2] will still give you "A".
In the case of (char*)i[2], the value located at i[2] is cast to a pointer, and if any string handling function dereferences it, it will try to access the memory location 65(dec) for "A" and you'll have problems.
It was 4:30AM my time, cut me some slack. >_<