Trying to understand the behaviour of pointers in C, I was a little surprised by the following (example code below):
#include <stdio.h>
void add_one_v1(int *our_var_ptr)
{
*our_var_ptr = *our_var_ptr +1;
}
void add_one_v2(int *our_var_ptr)
{
*our_var_ptr++;
}
int main()
{
int testvar;
testvar = 63;
add_one_v1(&(testvar)); /* Try first version of the function */
printf("%d\n", testvar); /* Prints out 64 */
printf("@ %p\n\n", &(testvar));
testvar = 63;
add_one_v2(&(testvar)); /* Try first version of the function */
printf("%d\n", testvar); /* Prints 63 ? */
printf("@ %p\n", &(testvar)); /* Address remains identical */
}
Output:
64
@ 0xbf84c6b0
63
@ 0xbf84c6b0
What exactly does the *our_var_ptr++
statement in the second function (add_one_v2
) do since it's clearly not the same as *our_var_ptr = *our_var_ptr +1
?
Due to operator precedence rules and the fact that ++
is a postfix operator, add_one_v2()
does dereference the pointer, but the ++
is actually being applied to the pointer itself. However, remember that C always uses pass-by-value: add_one_v2()
is incrementing its local copy of the pointer, which will have no effect whatsoever on the value stored at that address.
As a test, replace add_one_v2()
with these bits of code and see how the output is affected:
void add_one_v2(int *our_var_ptr)
{
(*our_var_ptr)++; // Now stores 64
}
void add_one_v2(int *our_var_ptr)
{
*(our_var_ptr++); // Increments the pointer, but this is a local
// copy of the pointer, so it doesn't do anything.
}