Search code examples
cpointersoperatorsoperator-precedence

c: when using a pointer as input in a function incrementing the pointers value by using *pointer++ doesn't work


While I was learning C (I am very new to it), I was playing around with pointers. Here you can see my code:

#include <stdio.h>

void change(int *i)
{
    *i += 1;  
}

int main()
{   
    int num = 3;

    printf("%d\n", num);
    change(&num);
    printf("%d\n", num);

    return 0;
}

My aim was to replace incrementing the num value without reassigning it like so:

num = change(num);

That's why I was passing the memory location of num using the &: so it could be used as a pointer. Before this version everything in the code was the same. The only thing that was different was that I said *i++; instead of saying *i += 1;

Now my question is why can't I say *i++?


Solution

  • Now my question is why i can't say *i++

    Due to operator precedence, *i++ is same as *(i++).

    *(i++);
    

    is equivalent to:

    int* temp = i;  // Store the old pointer in a temporary variable.
    i++;            // Increment the pointer
    *temp;          // Dereference the old pointer value, effectively a noop.
    

    That is not what you want. You need to use (*i)++ or ++(*i). These will dereference the pointer first and then increment the value of the object the pointer points to.