I cannot figure this out. Perhaps it is because it's 2am. At any rate, I am at a loss here.
#include <stdio.h> int main() { char array[] = "123456789"; char* ptr = array; printf("%c\n", *(ptr++)); printf("%c\n", *ptr); *ptr = array[3]; printf("%c\n", *(ptr++)); printf("%c\n\n", *ptr); return 0; }
The result is:
1 2 4 3
I have a pointer, which I assign to array
.
I then print, what I thought would be the first index ( '2'
), but instead get 1
. -- So, I assume that *(ptr++)
actually dereferences, before it increments the pointers.
Then I reassign ptr
the 4th index ( '4'
) and repeat step 2. This works as expected now that I see C does not calculate the parenthesis first before dereferencing.
Then I print the newly incremented ptr
to display ( '5'
) ... and I get 3
?
How is that, step 1&2 and 3&4 are identical, but I get different results?
Let's go through the code step-by-step:
Step 0:
char* ptr = array;
Point the char pointer to the start of array (namely position 0).
Step 1:
printf("%c\n", *(ptr++));
Dereference the pointer at position 0, print the value residing there (1
) and then increment the pointer to position 1
Step 2:
printf("%c\n", *ptr);
Dereference the pointer at position 1 and print the value residing there (2
)
Step 3:
*ptr = arr[3];
Dereference the pointer at position 1 and update the value pointed to with the value at position 3 of the array. This is value 4.
Step 4:
printf("%c\n\n", *(ptr++));
Dereference the pointer at position 1, print the value we just updated (4
) and then increment the pointer to position 2
Step 5:
printf("%c\n", *ptr);
Dereference the pointer at position 2 and print the value there (3
).
Perhaps what you actually intended is to have ptr = &arr[3];
which will assign the pointer to a new position (namely the address of arr[3]
).
Note that the braces around ptr
in the above are actually redundant due to operator precedence.
For the case of *(ptr++)
, post-increment has higher precedence than indirection therefore it will be applied before we dereference the pointer
Braces are also unnecessary around *(++ptr)
too. Here even though pre-increment and indirection have the same precedence, they are evaluated right-to-left. And so the pointer will be incremented before it is dereferenced.
ptr++
is post-increment operator, so the pointer increments AFTER it dereference it (according to the standard).
Besides, the step:
*ptr = array[3];
assigns to the array[1]
value 4, so you print 4 instead of 2 and increment to the 3.
The correct way of pointer assignment is:
ptr = &array[3];
or
ptr = (array + 3);
You are actually assigning the value of array[3]
to the value pointet by ptr
.