Code Generation: Pointers and Arrays
Lecture 11
Table of Contents
Pointers
- Pointers hold memory addresses
- Memory addresses are also integer values
- But addresses are differently from regular numbers
SimpleC constructs
Get a reference
Get the memory address of a variable
int x; pointer<int> y; x = 10; y = &x;
What is the value of y?
Dereference a pointer
Get the contents of the memory at a pointer address
int x; pointer<int> y; x = 10; y = &x; return *y;
What is the value of *y?
Update the contents of a memory via pointer
Get the contents of the memory at a pointer address
int x; pointer<int> y; x = 10; y = &x; *y = 11; return x;
What is the value of *y?
What is the value of y?
What is the value of x being returned?
Memory indirect addressing
- Recall that
mov %rax, %rbxmoves contents of rax to rbx
Move from memory address of a pointer
mov (%rax), %rbx(note parentheses) moves contents of memory at address contained in rax to rbx- Handles
x = *y
Move to a memory address of a pointer
mov %rax, (%rbx)(note parentheses) moves contents of rax to memory address contained in rbx- Handles
*y = 10
Pointer demo in SimpleC
- (Demo with gdb)
Pointer arithmetic
- Pointers are memory address
- Addresses look no diferent from integers to the machine
- Assembly allows arithmetic on integers
Tricky example
What does this program return?
main {
int x;
int y;
pointer<int> z;
x = 1;
y = 2;
z = &x - (pointer<int>)8;
return *z;
}
Arrays
- Arrays in C are (basically) pointers
Array indexing is syntactic sugar for pointer arithmetic
a[2]is the same as(a + 2 * 8), where 8 is the bitwidth of the array's type- Compiler allocates space for arrays on stack
- Heap-allocated arrays with malloc
- Implementation in SimpleC is a bonus exercise