Open Source Your Knowledge, Become a Contributor
Technology knowledge has to be shared and made accessible for free. Join the movement.
Given an array arr[ARRAY_SIZE] we can get the address of the i-th element by arr + i as arr works as a pointer to the first element of the array. This is true for any pointer pointing any element of arr array.
In the example above, p points to the 4th element of array by the assignment p = arr + 3. The statement *p = 55; modifies the contents of the memory location pointed to by p, essentially arr[3].
In the following example, all array elements are modified by pointer:
This is what happens in the example above. arr is initialized as follows:
arr: 1 2 3 4
address: 10 14 18 22
The address is hypothetical here. p points to the first element of arr by int32_t *p = arr;:
arr: 1 2 3 4
address: 10 14 18 22
^
|
p
A loop iterates ARRAY_SIZE times. In each iteration *p is multiplied by *p - the dereferenced value of p is squared - and stored in the memory location pointed to by p by the statement *p *= *p;. This modifies one array element in every iteration. The next statement, p++;, increments the pointer p, not by 1, but by sizeof(*p), equivalently sizeof(int32_t) - in this case 4 at a time.
In the hypothetical address above:
before 1st iteration: p = 10
after 1st iteration : p = 14
after 2nd iteration : p = 18
after 3rd iteration : p = 22
after 4th iteration : p = 26
This can be verified by the following example with 16 bit integer:
Notice that p is incremented by 2, or sizeof(int16_t), at every iteration.
Warning: When the loop exits in the above example, p points to one past the last element of arr. That area is outside the declared variables in the program. Accessing that location is undefined behaviour.
int16_t arr[ARRAY_SIZE] = { 0 };
int16_t *p = arr;
for (int i = 0; i < ARRAY_SIZE; i++)
{
printf("%p\n", p);
p++;
}
/* printf("%d\n", *p); */ /* Fatal: p points to outside location of declared variable - undefined behaviour */