The fact that we're talking about C doesn't really make a difference, if you genuinely desire negative indices:
int array[FOO];
int *shifted_array = array + FOO/2; int array[FOO];
int *shifted_array = array + FOO/2;EDIT: just tried it. The following works:
#include <stdio.h>
int main(void)
{
int array[100];
int *shifted_array = array - 1980;
for (int i = 0; i < 100; i++)
array[i] = i;
for (int j = 1980; j < 2014; j++)
printf("shifted_array[%d] = %d\n", j, shifted_array[j]);
return 0;
}More amusing, but less useful outside the IOCCC:
The C subscripting operator performs an basically syntactic transformation, turning a[i] into (*(a + i)). This means that, counter-intuitively (if you're thinking of [] as a lookup) the construct i[a] works too because plus is commutative.