You're overwriting the pointer, then dereferencing it... if your code looked like this it would work... but that may not be what you're after.
int int_out;
store ( storage_int, &int_in, sizeof(int));
retrive ( &int_out, storage_int, sizeof(int));
assert ( 55 == int_out);
or:
int *int_out;
store ( storage_int, &int_in, sizeof(int));
retrive ( &int_out, storage_int, sizeof(int));
assert ( 55 == (int)int_out);
However, in the second case this is a bit dubious, because it assumes that both 'int' and 'int*' are the same size, so you're able to store one on top of the other when retrieving. I believe this isn't the case on all systems.