A pointer to a struct lets a function update the original grouped value.

arrow operator `point->x` means the `x` field of the struct pointed to by `point`.
update original Passing a pointer lets the function write back into the caller's struct.

Struct Pointers

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

struct Point {
    int x;
    int y;
};

void moveRight(struct Point *point, int delta) {
    point->x = point->x + delta;
}

int main(void) {
    int delta = 2;
    struct Point point = {3, 4};

    moveRight(&point, delta);

    printf("x=%d y=%d\n", point.x, point.y);
    return 0;
}
#include <stdio.h>

struct Point {
    int x;
    int y;
};

void moveRight(struct Point *point, int delta) {
    point->x = point->x + delta;
}

int main(void) {
    int delta = 5;
    struct Point point = {3, 4};

    moveRight(&point, delta);

    printf("x=%d y=%d\n", point.x, point.y);
    return 0;
}
#include <stdio.h>

struct Point {
    int x;
    int y;
};

void moveRight(struct Point *point, int delta) {
    point->x = point->x + delta;
}

int main(void) {
    int delta = 8;
    struct Point point = {3, 4};

    moveRight(&point, delta);

    printf("x=%d y=%d\n", point.x, point.y);
    return 0;
}
  1. delta ← 2, point ← (empty)

    12int main(void) {13    int delta→ 2 = 2; //@delta=5, 814    struct Point point→ (empty) = {3, 4};1516    moveRight(&point(empty), delta2);
  2. point->x ← 5

    8void moveRight(struct Point *point⟨addr A⟩, int delta2) {9    point->x→ 5 = point->x + delta2;10}
  3. moveRight(&point, delta);

    16    moveRight(&point(empty), delta2);1718    printf("x=%d y=%d\n", point(empty).x, point.y);19    return 0;20}
    outputx=5 y=4
  1. delta ← 5, point ← (empty)

    12int main(void) {13    int delta→ 5 = 5;14    struct Point point→ (empty) = {3, 4};1516    moveRight(&point(empty), delta5);
  2. point->x ← 8

    8void moveRight(struct Point *point⟨addr A⟩, int delta5) {9    point->x→ 8 = point->x + delta5;10}
  3. moveRight(&point, delta);

    16    moveRight(&point(empty), delta5);1718    printf("x=%d y=%d\n", point(empty).x, point.y);19    return 0;20}
    outputx=8 y=4
  1. delta ← 8, point ← (empty)

    12int main(void) {13    int delta→ 8 = 8;14    struct Point point→ (empty) = {3, 4};1516    moveRight(&point(empty), delta8);
  2. point->x ← 11

    8void moveRight(struct Point *point⟨addr A⟩, int delta8) {9    point->x→ 11 = point->x + delta8;10}
  3. moveRight(&point, delta);

    16    moveRight(&point(empty), delta8);1718    printf("x=%d y=%d\n", point(empty).x, point.y);19    return 0;20}
    outputx=11 y=4