I was just reading some code and found that the person was using arr[-2] to access the 2nd element before the arr, like so:
|a|b|c|
About why would someone want to use negative indexes, I have used them in two contexts:
Having a table of combinatorial numbers that tells you comb[1][-1] = 0; you can always check indexes before accessing the table, but this way the code looks cleaner and executes faster.
Putting a centinel at the beginning of a table. For instance, you want to use something like
while (x < a[i]) i--;
but then you should also check that i is positive.
Solution: make it so that a[-1] is -DBLE_MAX, so that x<a[-1] will always be false.