Swapping pointer variables changes which data each name refers to.

pointer variable The pointer itself is a variable whose stored address can be replaced.
alias movement After a swap, each pointer name aliases a different object.

Swap Pointers

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

static void swap_int_pointers(int **first, int **second) {
    int *temp = *first;
    *first = *second;
    *second = temp;
}

int main(void) {
    int a = 3;
    int b = 10;
    int *left = &a;
    int *right = &b;

    swap_int_pointers(&left, &right);

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

static void swap_int_pointers(int **first, int **second) {
    int *temp = *first;
    *first = *second;
    *second = temp;
}

int main(void) {
    int a = 1;
    int b = 10;
    int *left = &a;
    int *right = &b;

    swap_int_pointers(&left, &right);

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

static void swap_int_pointers(int **first, int **second) {
    int *temp = *first;
    *first = *second;
    *second = temp;
}

int main(void) {
    int a = 8;
    int b = 10;
    int *left = &a;
    int *right = &b;

    swap_int_pointers(&left, &right);

    printf("left=%d right=%d\n", *left, *right);
    return 0;
}
  1. a ← 3, b ← 10, left ← ⟨addr A⟩, right ← ⟨addr B⟩

    9int main(void) {10    int a→ 3 = 3; //@a=8, 111    int b→ 10 = 10;12    int *left→ ⟨addr A⟩ = &a3;13    int *right→ ⟨addr B⟩ = &b10;1415    swap_int_pointers(&left⟨addr A⟩, &right⟨addr B⟩);
  2. temp ← ⟨addr A⟩

    3static void swap_int_pointers(int **first⟨addr C⟩, int **second⟨addr D⟩) {4    int *temp→ ⟨addr A⟩ = *first⟨addr C⟩;5    *first⟨addr C⟩ = *second⟨addr D⟩;6    *second⟨addr D⟩ = temp⟨addr A⟩;7}
  3. left ← ⟨addr B⟩, right ← ⟨addr A⟩

    15    swap_int_pointers(&left→ ⟨addr B⟩, &right→ ⟨addr A⟩);1617    printf("left=%d right=%d\n", *left⟨addr B⟩, *right⟨addr A⟩);18    return 0;19}
    outputleft=10 right=3
  1. a ← 1, b ← 10, left ← ⟨addr A⟩, right ← ⟨addr B⟩

    9int main(void) {10    int a→ 1 = 1;11    int b→ 10 = 10;12    int *left→ ⟨addr A⟩ = &a1;13    int *right→ ⟨addr B⟩ = &b10;1415    swap_int_pointers(&left⟨addr A⟩, &right⟨addr B⟩);
  2. temp ← ⟨addr A⟩

    3static void swap_int_pointers(int **first⟨addr C⟩, int **second⟨addr D⟩) {4    int *temp→ ⟨addr A⟩ = *first⟨addr C⟩;5    *first⟨addr C⟩ = *second⟨addr D⟩;6    *second⟨addr D⟩ = temp⟨addr A⟩;7}
  3. left ← ⟨addr B⟩, right ← ⟨addr A⟩

    15    swap_int_pointers(&left→ ⟨addr B⟩, &right→ ⟨addr A⟩);1617    printf("left=%d right=%d\n", *left⟨addr B⟩, *right⟨addr A⟩);18    return 0;19}
    outputleft=10 right=1
  1. a ← 8, b ← 10, left ← ⟨addr A⟩, right ← ⟨addr B⟩

    9int main(void) {10    int a→ 8 = 8;11    int b→ 10 = 10;12    int *left→ ⟨addr A⟩ = &a8;13    int *right→ ⟨addr B⟩ = &b10;1415    swap_int_pointers(&left⟨addr A⟩, &right⟨addr B⟩);
  2. temp ← ⟨addr A⟩

    3static void swap_int_pointers(int **first⟨addr C⟩, int **second⟨addr D⟩) {4    int *temp→ ⟨addr A⟩ = *first⟨addr C⟩;5    *first⟨addr C⟩ = *second⟨addr D⟩;6    *second⟨addr D⟩ = temp⟨addr A⟩;7}
  3. left ← ⟨addr B⟩, right ← ⟨addr A⟩

    15    swap_int_pointers(&left→ ⟨addr B⟩, &right→ ⟨addr A⟩);1617    printf("left=%d right=%d\n", *left⟨addr B⟩, *right⟨addr A⟩);18    return 0;19}
    outputleft=10 right=8