I was revisiting pointers when I had this doubt.
int *ptr;
int arr[5] = {10,20,30,40,50};
ptr = &arr[0];
Now printf("Value: %d",*ptr); would print 10
if I do:
ptr++;
printf("Value: %d",*ptr);
the result would be: 20
Similarly if I do:
*ptr++;
printf("Value: %d",*ptr);
the result is: 30
But
printf("Value: %d",++*ptr);
gives me 31
I thought since ptr is of type int when I increment it, it would jump 4 bytes to the next memory location. But why does it show the same behavior for *ptr++ and ptr++ and not for ++*ptr?
The first snippet is obvious: it prints what
ptrpoints to, i.e. 10.The second one, moves the pointer forward of one element, which then points to the next element, i.e. 20.
The third snippet is exactly the same as the previous one, because its first instruction increments the pointer and returns the unincremented value, which is dereferenced, but its result is discarded; what is dereferenced in the
printfis the incremented pointer, which now points to 30.The last snippet is different:
++*ptris++(*ptr);*ptrdereferencesptr(which already points to30), yielding 30, and++increments such value, which becomes 31.