Martin Nyaga

Bizarre Array Manipulation in C

February 22nd, 2017


Of all the strange behaviours I've come accross while trying to gain a working knowledge of C, this must be the most bizarre one yet.

Imagine you want to print all the numbers in a n array in C.

int main(){
  int arr[] = {1, 2, 3,4, 5};
  int i;

  for(i = 0; i < 5; i++){
    printf("%d\n", arr[i]);
  }

  return 0;
}

Works as you'd expect.

Now in C, arrays are really just pointers to an allocated block of memory. So arr, is a pointer to a block. The square bracket notation, arr[i] is just syntactic sugar for dereferencing a pointer. So arr[i] above is equivalent to:

printf("%d\n", *(arr + i));
// *(arr + i) => The value at the address given by (arr + i)

Now, because this operation is basic arithmetic, it means you should be able to access the same values using *(i + arr) . Fairly obvious, and it works as you'd expect.

printf("%d\n", *(i + arr));

Here's where things get a bit crazy.

If arr[i] is equivalent to *(arr + i) , and the square brackets are just syntactic sugar, then *(i + arr) should be the same as i[arr] . And so arr[i] and i[arr] are practically the same thing.

printf("%d\n", i[arr]);
// Absolutely insane

And it actually works.