Use bitshifts in Pointer instead of divides.
Construct specialized Pointer instances based on the size of elements so that the shifts in the getters/setters can be constants.
Add getElement and setElement methods to Pointer instances that let you pass an offset in elements instead of bytes, so that no shift is necessary for the offset.