First of all, there is no such thing as "Unicode gibberish". Unicode is not involved at all (I have an impression that you don't have a clue on Unicode, which is no good. :-))
The code is exactly as weird as explainable. No, it is not "working", too. Your result is unpredictable.
Let's number the elements of your array:
char* a[] = {
"this",
"is",
"a",
"test",
"string"
};
You start with 2, which is "a", but in print actually shift -2, so you print "this" and then increment. By some random reason, you get a null element past the array and your loop stops. As CHill60 correctly explained, nothing guarantees that your have null (0) anywhere past the array data. Some other data goes there. In other cases (for example, in different configuration of the build), you can get an exception, such as General Protection Fault.
I'm not writing the "correct" code because 1) you did not ask about it; 2) because you did not explain what should be the expected result.
—SA