Pointers
Pointer Aliases
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
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;
}
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
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
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