C passes function arguments by value, so a parameter receives a copy.

copy Changing a parameter does not change the caller's variable.
argument The argument value is copied into the parameter when the function is called.

Pass By Value

original
pass_by_value.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

void addOne(int value) {
    value++;
    printf("inside=%d\n", value);
}

int main(void) {
    int original = 3;

    addOne(original);
    printf("after=%d\n", original);
    return 0;
}
#include <stdio.h>

void addOne(int value) {
    value++;
    printf("inside=%d\n", value);
}

int main(void) {
    int original = 7;

    addOne(original);
    printf("after=%d\n", original);
    return 0;
}
#include <stdio.h>

void addOne(int value) {
    value++;
    printf("inside=%d\n", value);
}

int main(void) {
    int original = 10;

    addOne(original);
    printf("after=%d\n", original);
    return 0;
}
  1. original ← 3

    8int main(void) {9    int original→ 3 = 3; //@original=7, 101011    addOne(original3);12    printf("after=%d\n", original);
  2. value ← 4

    3void addOne(int value3) {4    value→ 4++;5    printf("inside=%d\n", value4);6}
    outputinside=4
  3. addOne(original);

    11    addOne(original3);12    printf("after=%d\n", original3);13    return 0;14}
    outputafter=3
  1. original ← 7

    8int main(void) {9    int original→ 7 = 7;1011    addOne(original7);12    printf("after=%d\n", original);
  2. value ← 8

    3void addOne(int value7) {4    value→ 8++;5    printf("inside=%d\n", value8);6}
    outputinside=8
  3. addOne(original);

    11    addOne(original7);12    printf("after=%d\n", original7);13    return 0;14}
    outputafter=7
  1. original ← 10

    8int main(void) {9    int original→ 10 = 10;1011    addOne(original10);12    printf("after=%d\n", original);
  2. value ← 11

    3void addOne(int value10) {4    value→ 11++;5    printf("inside=%d\n", value11);6}
    outputinside=11
  3. addOne(original);

    11    addOne(original10);12    printf("after=%d\n", original10);13    return 0;14}
    outputafter=10

Follow the Copy

  1. original starts as 3.
  2. addOne(original) copies 3 into the parameter named value.
  3. Inside the function, the copy becomes 4.
  4. The function prints inside=4.
  5. Back in main, original is still 3, so it prints after=3. | place | variable | value | | --- | --- | --- | | caller before call | original | 3 | | inside function | copied value | 4 | | caller after call | original | 3 |

Exercise: pass_by_value.c

Reproduce inside=4 and after=3, then use the pinned original variants 7 and 10 to predict inside=8 after=7 and inside=11 after=10.