The address of an array element can be taken, and simple arithmetic can be applied to it. Adding one to the address makes it point to the next element in the array. Subtracting one instead makes it point to the previous element.
int myArray[4] = { 9, 8, 7, 6 }; int *aep = &myArray[2]; int x, i; *(aep + 1) = 2; /* SetmyArray[3]to2. */ *(aep - 1) += 11; /* SetmyArray[1]to19. */ x = *(aep - 2); /* Setxto9. */
By definition, *(aep + i) is equivalent to
aep[i], and in many contexts,
an array name such as myArray
evaluates to the address of the first element, which is
how expressions such as myArray[2] work (it becomes *(myArray + 2)). The code above
could be written as:
int myArray[4] = { 9, 8, 7, 6 }; int *aep = &myArray[2]; int x, i; aep[1] = 2; /* SetmyArray[3]to2. */ aep[-1] += 11; /* SetmyArray[1]to19. */ x = aep[-2]; /* Setxto9. */
Note that an array name such as myArray can not be made to point
elsewhere:
int myArray[4]; int i; int *ip; ip = myArray; /* Okay:myArrayis a legal expression;ipnow points tomyArray[0]. */ myArray = &i; /* Error:myArrayis not a variable. */