Advanced Pointers
Swap Pointers
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
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;
}
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⟩);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}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
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⟩);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}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
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⟩);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}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