Two pointers can refer to the same object, so writing through one pointer changes what the other reads.

alias Pointers alias when they store the same address.
shared object A write through one alias updates the single shared object.

Pointer Aliases

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

int main(void) {
    int value = 5;
    int *left = &value;
    int *right = left;

    *right = *right + 1;

    printf("left=%d value=%d\n", *left, value);
    return 0;
}
#include <stdio.h>

int main(void) {
    int value = 8;
    int *left = &value;
    int *right = left;

    *right = *right + 1;

    printf("left=%d value=%d\n", *left, value);
    return 0;
}
#include <stdio.h>

int main(void) {
    int value = 11;
    int *left = &value;
    int *right = left;

    *right = *right + 1;

    printf("left=%d value=%d\n", *left, value);
    return 0;
}
  1. value ← 5, left ← ⟨addr A⟩, right ← ⟨addr A⟩

    3int main(void) {4    int value→ 5 = 5; //@value=8, 115    int *left→ ⟨addr A⟩ = &value5;6    int *right→ ⟨addr A⟩ = left⟨addr A⟩;78    *right⟨addr A⟩ = *right + 1;910    printf("left=%d value=%d\n", *left⟨addr A⟩, value6);11    return 0;12}
    outputleft=6 value=6
  1. value ← 8, left ← ⟨addr A⟩, right ← ⟨addr A⟩

    3int main(void) {4    int value→ 8 = 8;5    int *left→ ⟨addr A⟩ = &value8;6    int *right→ ⟨addr A⟩ = left⟨addr A⟩;78    *right⟨addr A⟩ = *right + 1;910    printf("left=%d value=%d\n", *left⟨addr A⟩, value9);11    return 0;12}
    outputleft=9 value=9
  1. value ← 11, left ← ⟨addr A⟩, right ← ⟨addr A⟩

    3int main(void) {4    int value→ 11 = 11;5    int *left→ ⟨addr A⟩ = &value11;6    int *right→ ⟨addr A⟩ = left⟨addr A⟩;78    *right⟨addr A⟩ = *right + 1;910    printf("left=%d value=%d\n", *left⟨addr A⟩, value12);11    return 0;12}
    outputleft=12 value=12